Laut MDN gibt for await...of es zwei Anwendungsfälle:
Die
for await...ofAnweisung erstellt eine Schleife, die sowohl über asynchrone iterierbare Objekte als auch über synchronisierte iterierbare Objekte iteriert.
Ersteres war mir vorher bekannt: asynchrone iterables using Symbol.asyncIterator. Aber ich interessiere mich jetzt für Letzteres: synchrone Iterables.
Der folgende Code iteriert über eine synchrone Iterable - eine Reihe von Versprechungen. Es scheint den Fortschritt bei der Erfüllung jedes Versprechens zu blockieren.
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)
Das Verhalten scheint so zu sein, als würde man nach der unten gezeigten Logik nacheinander auf jedes Versprechen warten. Ist diese Behauptung richtig?
Ich frage , weil dieses Muster von Code eine implizite Ablehnung Draht-up pitfall hat , dass Promise.allund zu Promise.allSettledvermeiden, und es scheint mir seltsam , dass dieses Muster explizit von der Sprache unterstützt werden würde.
for await... ofmit synchronen Iterablen korrekt, und wenn ja, spielt es eine Rolle, dass dieses Muster unbehandelte Ablehnungsfehler ausgeben kann?