我正在尝试使用 nodejs 和异步模块构建一个队列,但它没有按预期工作。
这是我的代码:
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
如您所见,await 不起作用。我试图 promisify 模块,但问题仍然存在。我尝试使用 d3-queue,我遇到了完全相同的问题。
有什么建议吗?
最佳答案
正如@Chiến Nghê 所说,您在不需要的地方使用了一些异步/等待,但这是另一个问题。
你的 await 在最后没有工作,因为你的 drain 函数在你的队列末尾被调用并且它没有返回 promise 。
您必须 promise 您的功能,这是一个示例:
function end() {
return new Promise((resolve, reject) => {
myQueue.drain = function () {
console.log('The queue is now empty.');
resolve();
};
})
}
然后您可以在结束函数上使用异步等待:
(async () => {
console.log('START');
run();
await end();
console.log('END');
})()
输出:
START
// a lot of logs
END
关于javascript - 等待异步队列进行(异步模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558262/