MDN mówi, że for await...of
ma dwa przypadki użycia:
for await...of
Instrukcja tworzy pętlę iteracji nad asynchroniczny iterable obiektów, jak również na iterables synchronizacji ...
Wcześniej zdawałem sobie sprawę z pierwszego: asynchroniczne iterowanie przy użyciu Symbol.asyncIterator
. Ale interesuje mnie teraz to drugie: iteracje synchroniczne.
Poniższy kod iteruje iterację synchroniczną - tablicę obietnic. Wydaje się, że blokuje postęp w wypełnianiu każdej obietnicy.
async function asyncFunction() {
try {
const happy = new Promise((resolve)=>setTimeout(()=>resolve('happy'), 1000))
const sad = new Promise((_,reject)=>setTimeout(()=>reject('sad')))
const promises = [happy, sad]
for await(const item of promises) {
console.log(item)
}
} catch (err) {
console.log(`an error occurred:`, err)
}
}
asyncFunction() // "happy, an error occurred: sad" (printed in quick succession, after about 5 seconds)
Zachowanie wydaje się podobne do oczekiwania na każdą obietnicę po kolei, zgodnie z logiką przedstawioną poniżej. Czy to twierdzenie jest prawidłowe?
Pytam, ponieważ ten wzór kodu ma niejawny odrzucenia wire-up pułapki że Promise.all
i Promise.allSettled
unikania, a wydaje mi się dziwne, że ten wzór będzie wyraźnie wspierane przez język.
for await... of
synchronicznych iteracji jest poprawny, a jeśli tak, to czy ma znaczenie to, że ten wzorzec może emitować nieobsługiwane błędy odrzucenia?