MDN dice que for await...of
tiene dos casos de uso:
La
for await...of
instrucción crea un ciclo que itera sobre objetos iterables asíncronos, así como en iterables sincronizados, ...
Anteriormente estaba al tanto de lo anterior: los iterables asíncronos usando Symbol.asyncIterator
. Pero ahora estoy interesado en lo último: iterables sincrónicos.
El siguiente código itera sobre un iterable síncrono: una serie de promesas. Parece bloquear el progreso en el cumplimiento de cada promesa.
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)
El comportamiento parece ser similar a esperar cada promesa por turno, según la lógica que se muestra a continuación. ¿Es correcta esta afirmación?
Pregunto porque este patrón de código tiene un error implícito de rechazo de conexión Promise.all
y Promise.allSettled
evitarlo, y me parece extraño que este patrón sea respaldado explícitamente por el lenguaje.
for await... of
correcta mi descripción de iterables sincrónicos? De ser así, ¿importa que ese patrón pueda emitir errores de rechazo no controlados?