J'ai imbriqué des boucles de foresach sur lesquelles l'un d'entre eux contient un autre appel attendu. Je veux que ma fonction ne soit que quelque chose d'être exécuté qu'après la fin de la boucle imbriquée. Dès maintenant Dosomething () est d'abord exécuté. Dosomething (); P> P>
3 Réponses :
Chaque fois que je dois utiliser des attentes à l'intérieur d'une foreach (ou de toute boucle d'itérateur; pour, tandis que, tandis que, des méthodes de tableau), j'aime créer un petit tableau où je stocke les promesses faites.
Je vais taper. sur un exemple. J'ai une liste de 10 URL, je souhaite exécuter une extraction à la recherche et stocker les résultats avant d'exécuter doSomething () code>. Mon
runfetch () code> -fonction est asynchrone et par défaut (sauf si je l'attends) renvoie une promesse. Après itération, j'attendrai toutes les promesses en même temps, afin qu'ils puissent courir à Parallell, mais attendez-vous toujours le plus lent. P>
const urls = [...] // my urls
const promises = []
for (const url of urls) {
promises.push( runFetch(url) )
}
const results = await Promise.all(promises)
//now that all my fetches are done, I can continue.
doSomething()
foreach em> peut être peu délicat dans de telles situations, vous pouvez simplement utiliser pour em> boucles à la place comme
Ils ne sauront pas à l'élément suivant jusqu'à ce que toutes les promesses ne soient pas résolues
JavaScript est-ce parce que Pancheach n'est pas conscient de la promesse. Il ne peut pas supporter ASYNC et attendre afin que vous ne puissiez pas utiliser attendre dans la recherche. Au lieu de cela, utilisez un de cette façon, les boucles imbriquées exécuteront d'abord et Voici un bon post si vous voulez en savoir plus:
https://zellwk.com/blog/async-await-in-loops/ < / a> p> p> pour ... de code> boucle:
Dosomething () Code> Dernier. P>
Je suppose que dialogue (); Devrait faire partie du bloc de code comme dernière ligne?