等待异步队列进行(异步模块)
Await for an async queue to be proceeded (async module)
我正在尝试使用 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
如您所见,等待无法正常工作。我试图 promisify 模块,但问题仍然存在。我尝试使用 d3-queue,我遇到了完全相同的问题。
有什么建议吗?
您的程序按原样运行。实际上你不需要为函数 run()
声明 async
。这个函数就是简单的把30个async task放到队列中等待执行然后结束
我不知道你想要什么,但如果你想要 console.log('END')
逻辑只执行队列中的每个异步任务完成。请将其移至队列的 drain()
函数。
正如@Chiến Nghê 所说,您正在使用一些不需要的 async/await,但这是另一个问题。
你的 await 在最后没有工作,因为你的 drain 函数在你的队列末尾被调用并且它没有返回承诺。
你必须承诺你的功能,这里有一个示例:
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
我正在尝试使用 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
如您所见,等待无法正常工作。我试图 promisify 模块,但问题仍然存在。我尝试使用 d3-queue,我遇到了完全相同的问题。
有什么建议吗?
您的程序按原样运行。实际上你不需要为函数 run()
声明 async
。这个函数就是简单的把30个async task放到队列中等待执行然后结束
我不知道你想要什么,但如果你想要 console.log('END')
逻辑只执行队列中的每个异步任务完成。请将其移至队列的 drain()
函数。
正如@Chiến Nghê 所说,您正在使用一些不需要的 async/await,但这是另一个问题。
你的 await 在最后没有工作,因为你的 drain 函数在你的队列末尾被调用并且它没有返回承诺。
你必须承诺你的功能,这里有一个示例:
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