在Node.js中顺序执行异步调用

时间:2019-10-20 18:11:54

标签: javascript node.js asynchronous async-await

我正在尝试循环运行Node.js异步函数。每个函数执行一个API调用,并将响应记录到控制台和文件中。问题在于,仅在所有调用完成执行后才写入日志,我希望输出按顺序记录。

代码如下:

const checkBatch = async function () {
  const MAX_BATCH = 20;
  for (let i = 0; i < MAX_BATCH; i++) {
    await apiCallAndLog();
  }
};


const q = async.queue((task, cb) => { console.log(`${task.name} processed`); cb(); });
for (let i = 0; i < MAX_CHECKS; i++) {
  q.push({ name: 'batch' + i }, checkBatch);
}

是否可以解决此问题,以便按顺序记录输出,而不是在所有批次完成之后记录输出?我已经尝试过简单的循环和异步队列(如本例所示)。

1 个答案:

答案 0 :(得分:0)

您需要使用checkBatch作为队列的工作者,而不是单个项目的回调:

const q = async.queue((task, cb) => {
  checkBatch(task).then(res => cb(null, res), err => cb(err));
});
for (let i = 0; i < MAX_CHECKS; i++) {
  q.push({ name: 'batch' + i }, (err, res) => console.log(`batch${i} processed`);}););
}

但是,正如您所看到的,async.js不能与Promise很好地协调,您最好选择一个Promise感知队列库。

或者完全放弃队列的需要,只需编写

for (let i = 0; i < MAX_CHECKS; i++) {
  await checkBatch({ name: 'batch' + i });
  console.log(`batch${i} processed`);
}