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

我有一个asynchronous函数与另外两个asynchronous函数的结果一起工作。

到目前为止,我所做的是在函数2的callback函数1和函数2中写入函数2

function1(callbackFunction() { function2(callbackFunction() { function3() }) }) 

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

我的情况是,对于函数2我不需要从函数1的输出。 换句话说,函数1和函数2是独立的; 但函数3依赖于函数1和函数2。

我希望我的函数2在函数1上独立运行,但函数3依赖于函数1和函数2运行。

有什么事吗?

 function1(); function2(); when(funtion1.complete && funtion2.complete) { function3(); } 

有一些好的库来处理编排asynchronous函数。 asyncq (或其他Promises / A库)的帮助。

如果function2不依赖于function1的结果,则可以并行执行它们。 以下是使用async (这些示例假设您的callbackfunction(err, result)具有function(err, result)签名,这是Node的事实模式:

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

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

 async.waterfall([ function(callback) { function1(callback); }, function(result, callback) { function2(result, callback); }, function(result, callback) { function3(result, callback); }, ]); 

就我个人而言,我喜欢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. }); 

或者,如果function1function2可以以任意顺序完成:

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

这是我烘焙的解决scheme。 您可以尝试呼叫pipe理器来调用相关function

 var func1 = function() { console.log("Dependant call ... " + 1); }; var func2 = function() { console.log("Dependant call ... " + 2); }; var func3 = function() { console.log("Dependant call ... " + 3); }; var func4 = function() { console.log("Dependant call ... " + 4); }; var CallManager = function(funcs_config) { var _this = this; _this.functions = funcs_config; _this.callAsynchronous = function(f) { if (f != undefined) { for (var i = 0; i < f.length; i++) { f[i].call(function() { this.callAsynchronous(f.splice(0,1)); }); } return; } for (var func in _this.functions) { if (_this.functions[func].length == 0) { //not dependent to any function } else { console.log('Calling....' + func); _this.callAsynchronous(_this.functions[func]); eval(func +'();'); } } }; return _this; }; var callManager = new CallManager({ //dependency configuration func2: [func1], //func2 depends on func1 func3: [func2], func4: [func1, func3] //func4 depends on both func1 and func3 }); callManager.callAsynchronous(); 

使用上面提供的当前configuration,当它运行时,输出被赋予 –

 Calling....func2 Dependant call ... 1 Dependant call ... 2 Calling....func3 Dependant call ... 2 Dependant call ... 3 Calling....func4 Dependant call ... 1 Dependant call ... 3 Dependant call ... 4