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.
la source
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?Réponses:
Oui, c'est étrange, et vous ne devriez pas faire ça. Ne parcourez pas les tableaux de promesses, cela conduit exactement au problème de rejet non géré que vous avez mentionné .
Alors pourquoi est-ce pris en charge dans la langue? Pour continuer avec la sémantique de la promesse bâclée.
Vous pouvez trouver le raisonnement exact dans ce commentaire de la question discutant cette partie de la proposition :
la source
unhandledrejection
événements?window.addEventListener('unhandledrejection',...
Bref: c'est la seule instance que je puisse évoquer, de ce type d'émission d'erreur par JavaScript. J'ai presque certainement tort de penser cela, cependant. Enfin: est-ce que l'émission de cette "erreur" importe vraiment au-delà d'avoir un message d'erreur indésirable dans la console?La
sad
promesse n'étant ed quand il échoue - que les besoins de code pour terminer en attente sur avant de pouvoir commencer à attendre . La promesse échoue avant d'être résolue. ( est un outil mieux adapté à ce cas d'utilisation)await
happy
sad
sad
happy
Promise.all
la source
Promise.all
c'est une meilleure solution, pourquoi le langage répond-il à cette syntaxe?for await...of
aurait pu facilement être implémenté pour simplement énumérer les itérables asynchrones. Mais ils l'ont pris en compte pour énumérer les itérables synchrones (mais avec un écueil (apparent?)). Pourquoi?for await ... of
accepte les itérables synchrones? J'imagine prendre en charge les générateurs asynchrones qui peuvent conditionnellement renvoyer des éléments synchrones.