【问题标题】:Parallel function calls in Node.jsNode.js 中的并行函数调用
【发布时间】:2012-12-11 16:23:04
【问题描述】:

我需要在 Node.js 中进行一些独立的数据库查询。执行完所有查询后,应发送响应。我的第一次尝试是这样的:

templateData = {};

model.getA(function(result) {
    templateData.A = result;

    model.getB(function(result) {
        templateData.B = result;

        model.getC(function(result) {
            templateData.C = result;

            response.send('template', templateData);
        })
    })
});

当然,Node.js 中的这种方法一点都不好,因为所有函数都是按顺序调用的,我失去了异步编程模式的优势。我是 Node.js 的新手,我仍然不清楚如何并行调用 getA()getB()getC() 并在一切完成后发送响应。是否有一些非常简单和常用的方法来实现这一点?

【问题讨论】:

    标签: javascript node.js function asynchronous


    【解决方案1】:

    您可以只使用一个函数来检查所有数据是否存在作为您对查询的回调,如果所有数据都存在,则可以发送响应。所以像

    function checkData(){
        if (templateData.A && templateData.B && templateData.C){
            //send your response
        }
    }
    

    那就不要嵌套你的调用

    model.getA(function(result){
        templateData.A = result;
        checkData();
    }
    
    model.getB(function(result){
        templateData.B = result;
        checkData();
    }
    
    model.getC(function(result){
        templateData.C = result;
        checkData();
    }
    

    当所有三个都完成后,您的回复将被发送。

    【讨论】:

      【解决方案2】:

      使用async package: (npm install async)

      async.parallel([
          function(){ ... },
          function(){ ... }
      ], callback);
      

      https://github.com/caolan/async#parallel

      或者,您可以使用promises

      Q.spread(
          [ model.getA(), model.getB(), model.getC() ],
          function(a, b, c) {
              // set templateData
              return templateData;
          }
      ).then(...);
      

      (假设get*() 方法返回承诺)

      【讨论】:

      • 谢谢,这正是我想要的!
      猜你喜欢
      • 2021-10-31
      • 2013-09-17
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2012-12-19
      相关资源
      最近更新 更多