【问题标题】:async.queue with async handler function - callback argument undefined带有异步处理函数的 async.queue - 回调参数未定义
【发布时间】:2023-02-21 02:35:35
【问题描述】:

我有一个队列,该队列使用基于 https://caolan.github.io/async/v3/docs.html#queue 的命令并具有异步功能,因为处理需要异步/等待。

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

任务的结果应通过“数据”发回。

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

问题:“数据”未定义。

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

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

【问题讨论】:

  • 你应该只是来自 async functionreturn data

标签: javascript node.js async-await


【解决方案1】:

看这里https://caolan.github.io/async/v3/global.html。异步函数不会从 ES2017 开始获取回调参数。看看你用的是什么 ES 版本。

解决方法是使工作函数不是“异步”的,而是基于承诺的。如果有人知道如何在不切换到承诺的情况下修复它,我们将不胜感激。

// 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 风格的异步函数,我们也直接接受一个 ES2017 异步函数。在这种情况下,async 函数不会传递最终回调参数,任何抛出的错误都将用作隐式回调的 err 参数,返回值将用作结果值。 (即拒绝返回的 Promise 成为 err 回调参数,并且解析值成为结果。)

【讨论】:

    【解决方案2】:

    我也对这个问题感到困惑。我可以通过使用回调传递任务处理程序(第一个参数)来使用 async.queue,但是当我传递一个异步函数(有或没有返回值)时,它就不起作用了。

    有没有将它与异步任务处理程序一起使用的具体示例?

    【讨论】:

    • 请不要添加我也是作为答案。它实际上并没有提供问题的答案。如果您有不同但相关的问题,请ask它(如果它有助于提供上下文,请参考此问题)。如果你对这个具体问题感兴趣,你可以upvote它,留下comment,或者一旦你有足够的reputation就开始bounty
    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多