MDN dit qu'il for await...of
a deux cas d'utilisation:
L'
for await...of
instruction crée une boucle itérative sur des objets itérables asynchrones ainsi que sur des itérables de synchronisation, ...
J'étais auparavant au courant de l'ancien: les itérables asynchrones utilisant Symbol.asyncIterator
. Mais je m'intéresse maintenant à ce dernier: les itérables synchrones.
Le code suivant itère sur un itérable synchrone - un tableau de promesses. Il semble bloquer le progrès sur la réalisation de chaque promesse.
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)
Le comportement semble être semblable à l'attente de chaque promesse tour à tour, selon la logique ci-dessous. Cette affirmation est-elle correcte?
Je demande parce que ce modèle de code a un rejet implicite de fil piège-up Promise.all
et Promise.allSettled
éviter, et il me semble étrange que ce modèle serait soutenu explicitement par la langue.
for await... of
itérables synchrones est-elle correcte et, dans l'affirmative, est-il important que ce modèle puisse émettre des erreurs de rejet non gérées?