Async/awaitはforEach非同期ループを処理できませんか?!



結論:Async/awaitはArrayである。prototype.foreachを使用する場合は非同期処理はできません。


ソース:DailyJS

const urls = [
  'https://lotsofinformation.com/loop/1',
  'https://lessinformation.com/loop/2',
  'https://lessinformation.com/loop/3'
];

async function loops() {
  await urls.forEach(async (url, idx) => { 
    const loop = await fetch(url);
    console.log(`Fetch loop ${idx+1}`);
  });
  
  console.log('Done!');
}

loops();

/* 결과:
Done!
Fetch loop 2
Fetch loop 1
Fetch loop 3
*/

質問:

  • forEachはawaitを使用していますが、Done!はまずログに表示され、その後urls.forEachの結果が表示されます.
  • より多くの処理時間を必要とする最初のループは、まずログに表示されず、2番目のループが直接表示されます.Fetchの場合、awaitがあっても、最初のurlの応答を待つことなく、処理状態となる.

    ソリューション:


    for...使用

    
    const urls = [
      'https://lotsofinformation.com/loop/1',
      'https://lessinformation.com/loop/2',
      'https://lessinformation.com/loop/3'
    ];
    
    async function loops() {
      for (const [idx, url] of urls.entries()) { 
        const loop = await fetch(url);
        console.log(`Fetch loop ${idx+1}`);
      }
      
      console.log('Done!');
    }
    
    loops();
    
    /* 결과:
    Fetch loop 1
    Fetch loop 2
    Fetch loop 3
    Done!
    */