2016-10-17 55 views
0

我正在使用async.waterfall,我想这样做:Nodejs异步瀑布,另一个流量控制?

保留async.waterfall的结果返回类似于Promise的内容。因此,我可以将这两部分分开。

function Action1(){ 

    return async.waterfall([ 
     function step1(callback){ 
      ... 
      callback(null, data); 
     }, 
     function step2(data, callback){ 
      ... 
      callback(null, data); 
     }, 
     function step3(data, callback){ 
      ... 
      callback(null, data); 
     } 
    ]); 
} 


Action1().then(function(result){ 
    // obtain the final result here 
}); 

但是,我能找到的是:最后的回调只能作为参数注入到瀑布函数中。

async.waterfall([ 
    function(callback) { 
     ... 
     callback(null, data); 
    }, 
    function(data, callback) { 
     ... 
     callback(null, data); 
    }, 
    function(data, callback) { 
     ... 
     callback(null, data); 
    } 
], function (err, result) { 

    // final callback 
    ... 
}); 

对我有没有什么建议可以达到预期的编程结构?或者异步以外的任何选择都允许这种模式?

回答

0

你应该去蓝鸟。

async这样的代码:

async.waterfall([ 
    function(callback) { 
     callback(null, 'one', 'two'); 
    }, 
    function(arg1, arg2, callback) { 
     // arg1 now equals 'one' and arg2 now equals 'two' 
     callback(null, 'three'); 
    }, 
    function(arg1, callback) { 
     // arg1 now equals 'three' 
     callback(null, 'done'); 
    } 
], function (err, result) { 
    // result now equals 'done' 
}); 

能(使用Blubird)这样写:

Promise.resolve(['one', 'two']).spread(function(arg1, arg2) { 
    // arg1 now equals 'one' and arg2 now equals 'two' 
    return 'three'; 
}).then(function(arg1) { 
    // arg1 now equals 'three' 
    return 'done'; 
}).then(function(result) { 
    // result now equals 'done' 
}); 

您可以参考http://bluebirdjs.com/docs/coming-from-other-libraries.html#coming-from-async-module获取更多信息。

+0

我需要在每个步骤中调用异步函数。但是'Promise.then'需要'return'继续。 – user3711105

+0

@ user3711105请参阅文档。它在那里解释。 –