异步.具有异步处理函数的队列-回调参数未定义



我有一个队列,它使用一个async函数使用基于https://caolan.github.io/async/v3/docs.html#queue的命令,因为处理需要async/await。

this.commandQueue = async.queue(async (task, callback) =>
{
await this.sleep(10); // Long running async stuff
callback(null, data);
}, 1);

任务的结果将通过'data'返回。

this.commandQueue.push(
{
...command data
}, function (err, data)
{
// called when task finished - callback called
... // data is undefined
});

问题:'data' is undefined.

当我从顶部函数部分删除async/await时,它可以工作,但我不能调用我的长时间运行的任务:-(

我不知道如何解决这个问题。有提示吗?

见这里https://caolan.github.io/async/v3/global.html。Async函数不会从ES2017开始获得回调参数。看看你用的是哪个ES版本。

解决方法是使worker函数不是"async"但是基于承诺。如果有人知道如何在不切换到承诺的情况下修复它,将不胜感激。

// async bases
async function worker(opts, callback) { // callback will be undefined}
const q = async.queue(worker)
//promised based
function worker(opts, callback) { // callback will work as expected}
const q = async.queue(worker)

无论我们接受node风格的async函数,我们也直接接受ES2017异步函数。在这种情况下,async函数不会被传递最终回调参数,任何抛出的错误将被用作隐式回调的err参数,返回值将被用作结果值。(也就是说,返回的Promise的一个被拒绝的值成为err回调参数,一个解析的值成为结果。)

最新更新