Utilisez les boucles async/await et forEach pour fonctionner
P粉010967136
P粉010967136 2023-08-20 11:27:20
0
2
542
<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>
P粉010967136
P粉010967136

répondre à tous(2)
P粉697408921

Avec ES2018, vous pouvez grandement simplifier toutes les réponses ci-dessus :

async function printFiles () {
  const files = await getFilePaths()

  for await (const contents of files.map(file => fs.readFile(file, 'utf8'))) {
    console.log(contents)
  }
}

Voir la spécification : proposition-async-iteration

Simplifié :

for await (const results of array) {
    await longRunningTask()
  }
  console.log('I will wait')

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.

P粉094351878

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 :

async function printFiles () {
  const files = await getFilePaths();

  for (const file of files) {
    const contents = await fs.readFile(file, 'utf8');
    console.log(contents);
  }
}

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.allwait sur le tableau de promesse obtenu :

async function printFiles () {
  const files = await getFilePaths();

  await Promise.all(files.map(async (file) => {
    const contents = await fs.readFile(file, 'utf8')
    console.log(contents)
  }));
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal