【问题标题】:Using async waterfall to pass arguments使用异步瀑布传递参数
【发布时间】:2017-04-28 04:39:04
【问题描述】:

考虑一种情况,瀑布中第一个函数的回调值需要在后续函数中多次使用以最终合并结果。在以下代码中,baseFn 应在回调中返回一个数组,然后应按照 subFn1 和 subFn2 中的指示逐个元素处理该数组。此后,必须将 subFn1 和 subFn2 的返回回调附加到一个新数组中以生成最终结果。我试图看看,是否有办法使用 async.series 和 async.apply 来实现这一点,但还没有走得更远。请指教。

async.waterfall ([  

  function baseFn(baseCb) {      
    //a method that gets an array of elements  
    return (null, elementArray);
  },  
  function subFn1(elemArr, subFnCb) {  
    var elem = elemArr[0];  
    //a method that returns processed element  
    return (null, proc_elem1);  
  },  
  function subFn2(elemArr,subFnCb) {  
    var elem = elemArr[1];
    //a method that returns processed element  
    return (null, proc_elem2);  
  },  
  function aggOut() {}  
], function getOutput (err, out) {  
      console.log(out);  
})

【问题讨论】:

    标签: node.js async.js


    【解决方案1】:

    由于 subFn1() 和 subFn2() 都依赖于 baseFn,所以最好使用 async.auto(),因为我们可以指定 subFn1 的依赖,而 subFn2 是 baseFn()。代码如下:

    var async = require('async');
    
    async.auto({
      baseFn: function(autoCb) {
        var elementArray = ['one', 'two'];
        autoCb(null, elementArray);
      },
      subFn1: ['baseFn', function(results, autoCb) {
        var elem = results.baseFn[0];
        console.log('subFn1', elem);
    
        var proc_elem1 = 'proc_elem1';
        autoCb(null, proc_elem1);
      }],
      subFn2: ['baseFn', function(results, autoCb) {
        var elem = results.baseFn[1];
        console.log('subFn2', elem);
    
        var proc_elem2 = 'proc_elem2';
        autoCb(null, proc_elem2);
      }]
    }, function(err, results) {
      console.log('results', results);
    });
    

    输出将如下所示(注意 subFn1 和 subFn2 的完成顺序无法保证,因为它们并行运行。但是,最终回调中的最终“结果”对象将具有所有结果):

    subFn1 one
    subFn2 two
    results { baseFn: [ 'one', 'two' ],
      subFn1: 'proc_elem1',
      subFn2: 'proc_elem2' }
    

    【讨论】:

      【解决方案2】:
      const baseFn = function(baseCb) {
        // ...
        return baseCb(elementArray);
      }
      
      baseFn(function(elemArr) {
        // since subFn1 and subFn2 both need elemArr independently,
        // lets use async.parallel here.
        async.parallel([
          function subFn1(elemArr, subFnCb) {
            // ...
            return subFnCb(null, proc_elem1);
          }),
          function subFn2(elemArr, subFnCb) {
            // ...
            return subFnCb(null, proc_elem2);
          }),
        ], function(err, result) {
          // async.parallel callback with proc_elem1 and 2 in result.
          // you can now create your final result with elementArray
          // and both proc_elem.
          console.log([elemArr, result[0], result[1]]);
        });
      });
      

      【讨论】:

        猜你喜欢
        • 2012-10-17
        • 2016-05-20
        • 2016-01-20
        • 1970-01-01
        • 2023-03-15
        • 2014-10-31
        • 2018-11-13
        • 2020-09-06
        相关资源
        最近更新 更多