Javascript 异步循环后写入控制台

Javascript 异步循环后写入控制台,javascript,node.js,async-await,Javascript,Node.js,Async Await,我尝试做异步循环,在这里我做了一些事情,在它结束后,我向控制台写东西。看起来是这样的: const http = require('http'); async function load(link) { try{ http.get(link, response => console.log(`File: ${link}`)); }catch(e){ console.log('error'); } } async function

我尝试做异步循环,在这里我做了一些事情,在它结束后,我向控制台写东西。看起来是这样的:

const http = require('http');

async function load(link)
{
    try{
        http.get(link, response => console.log(`File: ${link}`));
    }catch(e){
        console.log('error');
    }
}

async function loop(arrayOfLinks)
{
    for(let link of arrayOfLinks)
        load(link);
}

module.exports = (arrayOfLinks) => {
    (async () => {
        await loop(arrayOfLinks);
        console.log('Files: '+arrayOfLinks.length);
    })();
}
但是,我有:

档案:3个
文件:
文件:
文件:

我想要的是:

文件:
文件:
文件:
档案:3

问题:

  • 为什么
    wait
    操作员不阻止下一步
  • 我怎样才能解决这个问题

  • 谢谢

    您需要确保
    load
    函数返回承诺
    http.get本身不会返回它,所以您需要包装它(或者使用基于承诺的http库,如
    fetch
    ,等等)

    简单的承诺包装可以如下所示:

    async function load(link) {
      try {
        return new Promise((resolve, reject) => {
          http.get(link, resolve).on('error', reject)
        })
        .then(response => console.log(`File: ${link}`))
      } catch (e) {
        console.log('error', e.message);
      }
    }
    
    async function loop(arrayOfLinks) {
      for (let link of arrayOfLinks)
        await load(link);
    }
    

    您还需要在
    循环中使用
    等待加载(link)

    您可以尝试
    等待http.get(link,response=>console.log(`File:${link}')和<代码>等待加载(链接)但如果我为(让arrayOfLinks的链接)等待加载(链接)
    ,它将不再是一个异步循环,对吗?因为有一个原因,它在幕后仍然是异步的,但从语法上讲,它是异步的,是的。