Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.05.2024, 19:15
Новичок на форуме
Отправить личное сообщение для squid Посмотреть профиль Найти все сообщения от squid
 
Регистрация: 06.05.2024
Сообщений: 3

Последовательный вывод информации при fetch/ajax
Здравствуйте. Подскажите, пожалуйста способ информирования на странице при большой обработки информации. Есть база с id товарами. Первым запросом я получаю массив нужных id, а во втором, через for, перебираю id и отсылаю его на сервер который по api уже запрашивает данные товара и обрабатывает. Вместе с тем отдаёт, после обработки, например, название товара которое я вывожу в span. Камень преткновения асинхронность так как сервис разрешает делать только 3 запроса в секунду. Я так понимаю нужно использовать promise c await. Что выдал поиск, то у меня почему-то не работает. Он не выводит отданное имя последовательно, а отдаёт пачками. Не понятно чего он там ждёт. Примерный мой алгоритм (допускаю, что крив)
$ajax({
	data: {ids},
	onsuccess: function( res ) {
		request(res.lists, res.count);
	}
})

function request(res, count){
	for (let i = 0; i < res.length; i++) {
		$ajax({
			data: {res[i]},
			onsuccess: function(ret) {
				document.getElementById("title").innerHTML = ...
			}
		})
	}
}

Я бы проще сервер на сокете запустил, но увы нет возможности.
Ответить с цитированием
  #2 (permalink)  
Старый 07.05.2024, 08:10
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,712

Сообщение от squid
Примерный мой алгоритм
Ну примерно так надо
$ajax({
    data: {ids},
    onsuccess: function( res ) {
        request(res.lists, res.count);
    }
})

function request(res, count){

	let t0 = performance.now();

	// Если от t0 прошло меньше 1 сек, делаем задержку до 1 сек.
	const delay = () {
		const t = performance.now() - t0;
		dt = 1000 - (t - t0);
		const t0 = t;
		return new Promise ((resp) => {
			if (dt > 0) 
				setTimeout (resp, dt);
			else 
				resp();
		})
	}

	// Запрос к серверу
	const getajax (data) {
		reurn new Promise ( (resp() => {
			$ajax({
				data: {data},
				onsuccess: function(ret) {
					resp(ret);
				}
			})
		})
	}

	let p = Promise.resolve();

	for (let i = 0; i < res.length; i++) {
		// После каждых 3 запросов, делаем задержку, если необходимо
		if (i && i % 3 === 0) p = p.then ( () => delay () );
		
		p = p
			.then ( () => getajax (res[i]))
			.then ( (ret) => {document.getElementById("title").innerHTML = ...})
	}
}
Ответить с цитированием
  #3 (permalink)  
Старый 07.05.2024, 13:39
Новичок на форуме
Отправить личное сообщение для squid Посмотреть профиль Найти все сообщения от squid
 
Регистрация: 06.05.2024
Сообщений: 3

voraa, Я думал на бэки сделать задержку. Там одна строка всего. 4000000 микросекунд после каждого запроса. Мне главное, что бы js дождался ответа и не выполнял дальше пока выполняется запрос. Я в js слаб можете, пожалуйста, подправить с учётом sleep на сервере?
Ответить с цитированием
  #4 (permalink)  
Старый 07.05.2024, 17:18
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,712

Сообщение от squid
4000000 микросекунд после каждого запроса.
Это не 3 запроса в секунду, это - 4 сек между запросами?
Сообщение от squid
Мне главное, что бы js дождался ответа и не выполнял дальше пока выполняется запрос
JS не может просто ждать. Он запускает асинхронную операцию (например запрос к серверу), назначает функцию, которая должна быть выполнена, когда операция завершится (придет ответ от сервера), но сам идет выполняться дальше, не ожидая, когда операция завершится.

В Promise задается асинхронная операция. В then назначается функция, которая будет выполняться при завершении асинхронной операции.

Ну если задержки реализованы на сервере, то можно обойтись без функции delay и ожидания - строки
// После каждых 3 запросов, делаем задержку, если необходимо
 if (i && i % 3 === 0) p = p.then ( () => delay () );
Ответить с цитированием
  #5 (permalink)  
Старый 07.05.2024, 18:58
Новичок на форуме
Отправить личное сообщение для squid Посмотреть профиль Найти все сообщения от squid
 
Регистрация: 06.05.2024
Сообщений: 3

Сообщение от voraa Посмотреть сообщение
Это не 3 запроса в секунду, это - 4 сек между запросами?
Ноликом ошибся.

Сообщение от voraa Посмотреть сообщение
Ну если задержки реализованы на сервере, то можно обойтись без функции delay и ожидания - строки
// После каждых 3 запросов, делаем задержку, если необходимо
 if (i && i % 3 === 0) p = p.then ( () => delay () );
Спасибо.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
owl carousel 2 - вывод нужного изображения при клике с внешних кнопок galaydas Элементы интерфейса 5 19.07.2019 23:20
Вывод информации из клонированных полей nforcer89 Общие вопросы Javascript 3 13.11.2018 09:33
Вывод сообщения при наведении на фотографию Turok005 Общие вопросы Javascript 4 24.11.2010 16:28
Вывод сообщения при нажатии MCTrane Общие вопросы Javascript 1 15.01.2010 16:09
Вывод данных единожды, при открытии окна? Ggorsh Events/DOM/Window 1 28.04.2009 01:04