async/await
идеально подходит для этого.
Предполагается, что у вас есть массив URL-адресов в виде строк:
let urls = ["https://example.org/", "https://google.com/", "https://stackoverflow.com/"];
Вам просто нужно сделать:
for (let u of urls) {
await fetch(u).then(res => {
// Handle response
}).catch(e => {
// Handle error
});
}
L oop не будет повторяться до тех пор, пока не разрешится текущий fetch()
, что приведет к сериализации.
Причина, по которой array.map
не работает, заключается в следующем:
async function doFetch(url) {
return await fetch(url).then(res => {
// Handle response
}).catch(e => {
// Handle error
});
}
let mapped = urls.map(doFetch);
эквивалентно:
let mapped;
for (u of urls) {
mapped.push(doFetch(u));
}
Это немедленно заполнит mapped
группой Promise
s, что не то, что вам нужно. Вот что вам нужно:
let mapped;
for (u of urls) {
mapped.push(await doFetch(u));
}
Но это не то, что array.map()
делает. Поэтому использование явного for
l oop необходимо.