在异步循环后写入控制台

时间:2017-11-01 15:20:36

标签: 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 loop(arrayOfLinks)
{
    for(let link of arrayOfLinks)
        load(link);
}

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

但是,我有什么:

  

档案:3
  档案:http://localhost:8000/1.jpg
  档案:http://localhost:8000/2.jpg
  档案:http://localhost:8000/3.jpg

我想要的是什么:

  

文件:http://localhost:8000/1.jpg
  档案:http://localhost:8000/2.jpg
  档案:http://localhost:8000/3.jpg
  档案:3

问题:

  1. 为什么await运算符不会阻止下一步?
  2. 我该如何解决这个问题?
  3. 由于

1 个答案:

答案 0 :(得分:2)

您需要确保load函数返回Promise。 http.get本身不会返回它所以你想要包装它(或使用基于promise的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);
}

您还需要在await load(link)中使用loop