node js async.parallel with await 可能吗?

问题描述

我在 node js 中遇到 async.parallel 问题。以下代码运行完美

  var data = {};

  data.task_1= function(callback) { 
    var res_1 = "hello 1";
    callback(null,res_1);
  }
  data.task_2 = function(callback) { 
    var res_2 = "hello 2";
    callback(null,res_2);
  }

  async.parallel(data,function(err,results) {
    if (err){
      console.log(err);
    }
    console.log(results);
  });

结果是:{ task_1: 'hello 1',task_2: 'hello 2' }

但是,如果我尝试使用从数据库调用数据的函数来执行任务,则会出现以下错误TypeError: callback is not a function 和结果 { task_2: 'hello 2',task_1: undefined }

我在日志中看到,在记录 json 文件之前检索了数据。

这是我的代码

  var data = {};

  data.task_1 = async function(callback) { 
    var res_1 = await getData("xyz");
    console.log(res_1);
    callback(null,results) {
    if (err){
      console.log(err);
    }
    console.log(results);
  });

我想念什么?感谢您的帮助!

解决方法

您可以从 getData() 返回结果,这应该可以工作(根据文档):https://caolan.github.io/async/v3/global.html#AsyncFunction,您也可以使用 await 语句:

var data = {};

data.task_1 = async function() { 
    var res_1 = await getData("xyz");
    console.log(res_1);
    return res_1;
}
data.task_2 = function(callback) { 
    var res_2 = "hello 2";
    callback(null,res_2);
}

async.parallel(data,function(err,results) {
    if (err){
        console.log(err);
    }
    console.log(results);
});

我相信这是因为如果我们将函数标记为异步,则不会传递任何回调。因此,如果我分配一个非异步函数并使用 .then(),回调将被传递,并且一切都会很好地工作!来自文档:“无论我们接受 Node 风格的异步函数,我们也直接接受 ES2017 异步函数。在这种情况下,异步函数不会被传递一个最终的回调参数”这解释了错误消息“回调不是一个函数。”