我正在尝试循环运行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);
}
是否可以解决此问题,以便按顺序记录输出,而不是在所有批次完成之后记录输出?我已经尝试过简单的循环和异步队列(如本例所示)。
答案 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`);
}