如何处理依赖于多个其他异步函数的异步函数

Okk*_*kky 7 javascript asynchronous node.js

我有一个异步函数,可以处理另外两个异步函数的结果.

直到现在我正在做的是我在回调函数1中编写function2,在function2的回调中编写函数2

function1(callbackFunction() {
    function2(callbackFunction() {
        function3()
    })
})
Run Code Online (Sandbox Code Playgroud)

有没有其他办法来处理这个问题.我通常使用客户端和nodeJs中的JavaScript代码.

我的情况是,对于function2,我不需要function1的输出.换句话说,function1和function2是独立的; 但是function3依赖于function1和function2.

我希望我的function2在function1上独立运行,但是function3依赖于functio1和function2来运行.

有没有像

function1();
function2();
when(funtion1.complete && funtion2.complete) {
    function3();
}
Run Code Online (Sandbox Code Playgroud)

Jac*_*cob 6

有一些很好的库来处理编排异步函数.asyncq(或其他Promises/A图书馆)帮助.

如果function2不依赖于结果function1,则可以并行执行它们.以下是它的外观async(这些示例假设您的回调具有function(err, result)签名,这是Node的实际模式:

async.parallel([
    function(callback) { function1(callback); },
    function(callback) { function2(callback); }
], function(err, values) {
    function3(values[0], values[1]);
});
Run Code Online (Sandbox Code Playgroud)

如果function2取决于结果function1,waterfall可能是一个更好的模式:

async.waterfall([
    function(callback) { function1(callback); },
    function(result, callback) { function2(result, callback); },
    function(result, callback) { function3(result, callback); },
]);
Run Code Online (Sandbox Code Playgroud)

就个人而言,我喜欢q,因为你可以通过承诺并做各种漂亮的东西.以下是使用它的方式:

q.nfcall(function1)
  .then(function(result) { return q.nfcall(function2); })
  .then(function(result) { return q.nfcall(function3); })
  .fail(function(err) {
      // If any of them fail, this is called.
  });
Run Code Online (Sandbox Code Playgroud)

或者,如果function1并且function2可以按任意顺序完成:

q.all([q.nfcall(function1), q.nfcall(function2)])
 .then(function(values) { function3(values[0], values[1]); })
 .fail(function(err) {
 });
Run Code Online (Sandbox Code Playgroud)