Laut MDN gibt for await...of
es zwei Anwendungsfälle:
Die
for await...of
Anweisung 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.all
und zu Promise.allSettled
vermeiden, und es scheint mir seltsam , dass dieses Muster explizit von der Sprache unterstützt werden würde.
for await... of
mit synchronen Iterablen korrekt, und wenn ja, spielt es eine Rolle, dass dieses Muster unbehandelte Ablehnungsfehler ausgeben kann?