在asynchronous循环之后写入控制台

我试图做asynchronous循环,我做了一些事情,并在结束后,我写入控制台。 这是这样的:

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. 我该如何解决这个问题?

谢谢

您需要确保load函数返回Promise。 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); } 

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