Maison  >  Questions et réponses  >  le corps du texte

Utilisez les boucles async/await et forEach pour fonctionner

<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粉010967136P粉010967136427 Il y a quelques jours480

répondre à tous(2)je répondrai

  • P粉697408921

    P粉6974089212023-08-21 10:27:16

    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.

    répondre
    0
  • P粉094351878

    P粉0943518782023-08-21 09:14:18

    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)
      }));
    }

    répondre
    0
  • Annulerrépondre