2016-10-17 52 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請參閱文檔。它在那裏解釋。 –