MDN dice che for await...of ha due casi d'uso:
L'
for await...ofistruzione crea un ciclo che scorre su oggetti iterabili asincroni e su iterabili di sincronizzazione, ...
In precedenza ero a conoscenza del primo: async iterables using Symbol.asyncIterator. Ma ora sono interessato a quest'ultimo: iterables sincroni.
Il seguente codice scorre su un iterabile sincrono - una serie di promesse. Sembra bloccare il progresso sull'adempimento di ogni promessa.
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)
Il comportamento sembra essere simile ad attendere ogni promessa a turno, secondo la logica mostrata di seguito. Questa affermazione è corretta?
Lo chiedo perché questo schema di codice ha una trappola implicita di rifiuto che lo evita Promise.alled Promise.allSettledevita, e mi sembra strano che questo schema sia esplicitamente supportato dal linguaggio.
for await... ofiterables sincroni è corretta e, in caso affermativo, importa che quel modello possa emettere errori di rifiuto non gestiti?