如何处理依赖于多个其他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函数。 async
和q
(或其他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. });
或者,如果function1
和function2
可以以任意顺序完成:
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
- 使用Mongoose和FeedParser在node.js中完成多个callback时跟踪
- 当函数返回一个promise时,是否有任何好处?
- 如何从头开始在Javascript中编写asynchronousMap函数?
- 在if语句中使用child_process.exec的返回值?
- 我如何链接与Q的嵌套承诺? 我无法让他们按照正确的顺序运行
- 节点请求库错误:getaddrinfo ENOTFOUND dns.js 26
- Node.js:node.js中的http.get方法是否有同步版本?
- 有没有办法将信息传递给一个async.js并行调用,所以我不必使用全局variables?
- 如何使learnyounode#9杂耍asynchronous工作