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,783

Сообщение от 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,783

Сообщение от 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 () );
Спасибо.
Ответить с цитированием
  #6 (permalink)  
Старый Сегодня, 11:17
Новичок на форуме
Отправить личное сообщение для clare200 Посмотреть профиль Найти все сообщения от clare200
 
Регистрация: 18.06.2026
Сообщений: 1

Great discussion on handling sequential data with fetch! Have you considered error handling in your async calls? It’s crucial for ensuring stability. By the way, check out blumgi slime for some fun coding projects that could enhance your skills!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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