Node.js中的async.parallel能够与await一起使用吗?

3

我在使用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: '你好 1', task_2: '你好 2' }

但是,如果我尝试使用从数据库调用数据的函数来完成任务,则会出现以下错误: TypeError: 回调不是一个函数,结果为 { task_2: '你好 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, 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);
  });

我错过了什么?感谢任何帮助!

1个回答

1
你可以从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);
});

我认为这是因为如果我们将函数标记为async,就不会传递回调函数。因此,如果我分配一个非异步函数并使用.then(),回调函数将被传递,并且一切都将正常工作!根据文档:“无论在哪里接受Node风格的异步函数,我们也直接接受ES2017异步函数。在这种情况下,异步函数将不会传递最终的回调参数”,这解释了错误消息“回调不是函数”。

2
那与使用async/await有什么不同呢? - SoulKa
3
太好了!非常感谢。它有效了,但我没有看到与async/await的区别... - Harald
2
我认为这是因为如果我们将函数标记为async,就不会传递回调函数。因此,如果我分配一个非异步函数并使用.then(),回调函数将被传递,一切都将正常工作!从文档中可以看到:“无论在哪里,只要我们接受一个Node风格的异步函数,我们也直接接受ES2017的异步函数。在这种情况下,异步函数将不会传递最终的回调参数”,这解释了错误消息“回调不是函数”的原因。 - Terry Lennox
1
我想澄清一下,因为问题是用await这个术语来表述的。 - Aluan Haddad
1
如果你将一个函数标记为async,它将返回一个Promise对象,但其值为undefined。它仍然可以接受回调函数,并且需要显式地返回一个值,以便产生一个除了undefined之外的任何其他值的Promise对象。 - Aluan Haddad
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接