Utilisez les boucles async/await et forEach pour fonctionner
P粉010967136
2023-08-20 11:27:20
<p>Y a-t-il des problèmes avec l'utilisation de <code>async</code>/<code>await</code> dans une boucle <code>forEach</code> J'essaie de parcourir un tableau de fichiers et d'utiliser <code>await</code> </p>
<pre class="brush:php;toolbar:false;">importer fs depuis 'fs-promise'
fonction asynchrone printFiles () {
const files = wait getFilePaths() // Supposons que cette fonction fonctionne correctement
files.forEach(async (fichier) => {
const content = wait fs.readFile (fichier, 'utf8')
console.log(contenu)
})
}
printFiles()</pre>
<p>Ce code fonctionne, mais y a-t-il des problèmes à le faire ? On m'a dit que je ne devrais pas utiliser <code>async</code>/<code>await</code> dans des fonctions d'ordre supérieur comme celle-ci, je voulais donc demander s'il y avait des questions. </p>
Avec ES2018, vous pouvez grandement simplifier toutes les réponses ci-dessus :
Voir la spécification : proposition-async-iteration
Simplifié :
2018-09-10 : Cette réponse a retenu beaucoup d'attention ces derniers temps, voir Le billet de blog d'Axel Rauschmayer pour plus d'informations sur l'itération asynchrone.
Bien sûr, le code fonctionne, mais je suis presque sûr qu'il ne fonctionnera pas comme prévu. Cela déclenche simplement plusieurs appels asynchrones, mais la fonction
printFiles
revient immédiatement après.Lire dans l'ordre
Si vous souhaitez lire le fichier de manière séquentielle et qu'en effet ne pouvez pas l'utiliser,
forEach
。相反,你可以使用现代的for … of
循环,其中await
fonctionnera comme prévu :Lecture parallèle
Si vous souhaitez lire le fichier en parallèle, il n'est en effet pas possible d'utiliser
forEach
。每个async
回调函数调用都会返回一个promise,但你却将它们丢弃而不是等待它们。相反,你可以使用map
,并使用Promise.all
wait sur le tableau de promesse obtenu :