[英]Await for an async queue to be proceeded (async module)
我正在嘗試使用nodejs和async模塊構建隊列,但是無法按需工作。
這是我的代碼:
const async = require('async');
const queueSize = 10;
const taskHandler = function (task, done) {
task(done);
};
const myQueue = async.queue(taskHandler, queueSize);
myQueue.drain = function () {
console.log('The queue is now empty.');
};
function delay() {
return new Promise(resolve => setTimeout(resolve, 1000));
}
async function delayedLog(item) {
await delay();
console.log(item);
}
const run = async () => {
for (let item = 0; item < 30; item++) {
myQueue.push(async function (done) {
await delayedLog(item)
done();
});
}
}
(async () => {
console.log('START');
await run();
console.log('END);
})()
我想要的是:
START
// logs from delayedLog
END
輸出:
START
END
// logs from delayedLog
如您所見,等待不起作用。 我試圖使模塊分散,但問題仍然存在。 我嘗試使用d3隊列,但遇到了完全相同的問題。
有什么建議嗎?
您的程序按原樣工作。 實際上,您不需要為函數run()
聲明async
。 此功能僅是將30個異步任務放入隊列中以供以后執行,然后在此之后結束。
我不知道確切想要什么,但是如果要執行console.log('END')
邏輯,則僅完成隊列中的每個異步任務。 請將其移至隊列的drain()
函數。
正如@ChiếnNghê所說,您正在使用一些不需要等待的async / await,但這是另一個問題。
您的等待未在最后完成,因為您的排水功能在隊列的末尾被調用,並且未返回承諾。
您必須保證您的功能,這是一個示例示例:
function end() {
return new Promise((resolve, reject) => {
myQueue.drain = function () {
console.log('The queue is now empty.');
resolve();
};
})
}
然后您可以在end函數上使用異步等待:
(async () => {
console.log('START');
run();
await end();
console.log('END');
})()
輸出:
START
// a lot of logs
END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.