Как сделать цикл асинхронных http запросов с задержкой (setTimeout) после получения ответа от сервера (JavaScript)
Такая задача: необходимо сделать n-количество запросов на сервер, при этом каждый новый запрос происходит например через 2000ms После! получения ответа от сервера.
Есть такой цикл с setTimeout, но он отправляет запросы не проверяя ответил сервер на предыдущий запрос или нет, т.е. просто отправляет запросы с установленной периодичностью.
Подскажите как решить задачу, описанную выше?
for (let i = 0; i < array.length; i += 1) {
setTimeout(async () => {
const response = await dispatch(SomeHttpRequest);
dispatch(saveResponse);
}, 2000 * i);
}
Пробовал такой цикл, в данном случае запросы отправляются после ответа от сервера на предыдущий запрос, но как сюда добавить задержку в 2000ms не знаю...
for (const partNumber of array) {
const res = await dispatch(getProductsForCashingAction(1, 100, { search: partNumber }, partNumber));
dispatch(saveCashModalProducts(partNumber, res?.results));
}
Ответы (2 шт):
Автор решения: ortah
→ Ссылка
Создать промис и использовать .then https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise
Автор решения: nörbörnën
→ Ссылка
(async () => {
const array = new Array(10).fill(1);
for (let i = 0; i < array.length; i += 1) {
const res = await SomeHttpRequest().catch(() => null);
console.log(res);
await delay(2000);
}
})();
async function delay(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms);
});
}
async function SomeHttpRequest() {
return new Promise((resolve, reject) => {
setTimeout(
() => {
const random = Math.trunc(100 * Math.random());
if (random % 2) {
resolve(random);
} else {
reject(new Error('SOMETHING_WRONG'));
}
},
1000 + (100*Math.random())
)
});
}