javascript - 在异步循环后写入控制台

标签 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);
    })();
}

但是,我有:

Files: 3
File: http://localhost:8000/1.jpg
File: http://localhost:8000/2.jpg
File: http://localhost:8000/3.jpg

我想要的是:

File: http://localhost:8000/1.jpg
File: http://localhost:8000/2.jpg
File: http://localhost:8000/3.jpg
Files: 3

问题:

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

谢谢

最佳答案

您需要确保 load 函数返回 Promise。 http.get 本身不会返回它,因此您想包装它(或使用基于 promise 的 HTTP 库,如 fetch 等)。

简单的 promise 包装器可能如下所示:

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)

关于javascript - 在异步循环后写入控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47058176/

相关文章:

javascript - 更改控制台对象引用后即可访问控制台

javascript - 使用 LocalStorage 和 AngularJS 的缓慢应用程序

javascript - 我怎样才能用nodejs获得discord get membercount

c# - 使用 async 和 DataRow 的非线程安全代码

Flutter Firestore getDocuments() 不适用于 initState

javascript - 如何管理争论

javascript - 如何在javascript中打开文件上传对话框

node.js - 是否可以从 vagrant devbox 访问本地主机?

javascript - 如何捕获 socket.io 错误并防止它们出现在控制台中?

javascript - 异步等待默认行为