Если вы используете while
l oop, вы потенциально можете отправить много запросов, прежде чем один вернется. И даже когда кто-то вернется, это не обязательно будет в порядке. Вот краткий пример того, что может произойти, например, при скачке сети:
const sleep = ms => new Promise(res => setTimeout(res, ms));
async function mockNetworkCall(num) {
const timings = [50, 150, 50]
console.log(`sending request ${num}`);
await sleep(timings[num]);
console.log(`request ${num} finished`)
}
for(let i = 0; i < 3; i++) {
mockNetworkCall(i);
}
Вы можете избежать while
l oop, если вместо этого воспользуетесь подходом, чтобы выполнять новый запрос только после завершения последнего. В этом случае у вас будет активен только один запрос в любой момент времени, и вы знаете, что получаете результат по порядку.
Вы можете обернуть logi c для этого в простой функции, чтобы смотреть URL-адрес и повторно инициировать запрос только после завершения предыдущего. Это скелет для такой функции - возможно, потребуется настроить его в соответствии с вашими потребностями:
function watch({ url, retryCount, lastResponse = null}) {
fetch(url)
.then(res => {
/* do something */
return res;
})
.then(res => watch({url, retryCount, lastResponse: res})) //launch again
.catch(err => {
/* handle error */
console.error("error getting URL", err);
console.warn("retries left: ", retryCount);
if (retryCount-- > 0) {
watch({url, retryCount, lastResponse});
}
})
}
watch({url: "google.com", retryCount: 3});
Или то же самое, используя async/await
async function watch({ url, retryCount, lastResponse = null}) {
try {
const res = await fetch(url);
/* do something */
watch({url, retryCount, lastResponse: res}); //launch again
} catch (err) {
/* handle error */
console.error("error getting URL", err);
console.warn("retries left: ", retryCount);
if (retryCount-- > 0) {
watch({url, retryCount, lastResponse});
}
}
}
watch({url: "google.com", retryCount: 3});