O MDN diz que for await...of
tem dois casos de uso:
A
for await...of
instrução cria um loop que itera sobre objetos iteráveis assíncronos, bem como sobre iteráveis de sincronização, ...
Eu já tinha conhecimento do primeiro: async iterables usando Symbol.asyncIterator
. Mas agora estou interessado no último: iterables síncronos.
O código a seguir itera sobre uma iterável síncrona - uma matriz de promessas. Parece bloquear o progresso no cumprimento de cada 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)
O comportamento parece ser semelhante a aguardar cada promessa por sua vez, de acordo com a lógica mostrada abaixo. Esta afirmação está correta?
Eu pergunto porque esse padrão de código tem uma armadilha fio-up rejeição implícita de que Promise.all
e Promise.allSettled
evitar, e parece estranho para mim que esse padrão seria explicitamente suportada pelo idioma.
for await... of
iterables síncronos está correta e, em caso afirmativo, importa que esse padrão possa emitir erros de rejeição sem tratamento?