【问题标题】:node js async.parallel with await possible?节点 js async.parallel 与等待可能吗?
【发布时间】:2021-05-07 21:23:45
【问题描述】:

我在节点 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, 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);
  });

我错过了什么?感谢您的帮助!

【问题讨论】:

    标签: javascript node.js async.js


    【解决方案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);
    });
    

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

    【讨论】:

    • 这与使用 async/await 有什么不同?
    • @SoulKa:从你的角度来看,它可能不是。就个人而言,我喜欢他们在这里使用的延续传递风格。
    • 完美!非常感谢。它可以工作,但我也看不出异步/等待的区别......
    • 我相信这是因为如果我们将函数标记为异步,则不会传递任何回调。因此,如果我分配一个非异步函数并使用 .then(),回调将被传递,一切都会很好地工作!来自文档:“无论我们在哪里接受 Node 风格的异步函数,我们也直接接受 ES2017 异步函数。在这种情况下,异步函数将不会被传递最终回调参数”这解释了错误消息“回调不是函数。”
    • 我想澄清一下,因为这个问题的措辞是await
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2020-04-01
    • 2018-10-01
    • 2018-03-08
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多