nodejs:在执行之前等待其他方法完成

说我有2种方法:

function A(callback) { ... } function B(callback) { ... } 

我想执行:
函数C();
A和B都完成后。
我们通常做的是将函数C放在callback函数中,如:

 A(function() { B(function() { C(); }); }); 

现在如果A和B都需要很长时间,我不希望B在A完成后执行。 相反,我想同时启动它们来提高性能。
我在想的是实现一个像信号量(当然不是一个信号量),它在A和B完成后触发一个事件。 所以我可以从事件中调用C.

我想知道的是,有没有库已经实现了上述function? 我相信我不是第一个想做的人。
任何帮助表示赞赏。

展开我的评论…

async是Node.js 常用的asynchronousstream控制库。

它的async.parallel()可能会做得很好:

 async.parallel([ function(done) { A(function () { done(null); }); }, function(done) { B(function () { done(null); }); } ], function (err) { C(); }); 

这可能会缩短,但这取决于每个函数如何与callback交互,以及它们是否遵循常见的Node.js模式的error -firstcallback:

 async.parallel([A, B], C); 

为了完整起见,如上所述,使用一个外部对象来保持完成状态,A()和B()检查另一个是否完成,如果是,调用C(),可以达到相同的结果。 如:

 var results={}; function onComplete(){ if(results['A'] && results['B'] && !results['C']) { C(); } } function A(){ // ... results['A']=true; onComplete(); } function B(){ // ... results['B']=true; onComplete(); } 

结果对象可以通过向A()和B()添加一个“isComplete”标志来replace,如下所示:

 function A(){ // ... A.isComplete=true; onComplete(); } 

并修改onComplete来检查这个新的标志:

 function onComplete(){ if(A.isComplete && ... } 

或者,使用相同的事件:

 var util=require('util'), events=require('events'), EventEmitter=events.EventEmitter; function F(){ EventEmitter.call(this); // init ancestor } util.inherits(F,EventEmitter); // assign ancestor F.prototype.A=function(){ var self=this; console.log('running A()'); setTimeout(function(){ // simulate long running code - 5 seconds F.prototype.A.isComplete=true; self.emit('complete','A'); },5000); }; F.prototype.B=function(){ var self=this; console.log('running B()'); setTimeout(function(){ // simulate long running code - 3 seconds F.prototype.B.isComplete=true; self.emit('complete','B'); },3000); }; F.prototype.C=function(){ console.log('running C()'); }; var f=new F; f.on('complete',function(which){ // onComplete handler console.log(which+'() is complete'); if(F.prototype.A.isComplete && F.prototype.B.isComplete){ fC(); } }); // start it up fA(); fB(); 

当运行时,将产生:

 >node example.js running A() running B() B() is complete A() is complete running C() > 
 async.parallel([ function(){ ... }, function(){ ... } ], callback); 

来自: https : //github.com/caolan/async

所以在你的情况下:

 async.parallel([funcA,funcB],funcC); //function definitions function funcA() {...} function funcB() {...} function funcC() {...} 

没有模块,我想它会看起来像这样:

 var numFuncs = 2; A(D); B(D); and then function D() { if(numFuncs==0){ C(); } else { numFuncs--; }} 

或者像这样:

 A(D(C)); B(D(C)); function D() { var x = process.funcsToCall= process.funcsToCall || {}; var f=arguments[0]; (!x.hasOwnProperty(f.name))?x[f.name]=0:x[f.name]++; return function(){ (x[f.name]==0)?f():x[f.name]--; } } 

如果你在ES6上运行,你可以使用Promise.all 。 这里是重写的示例代码:

 Promise.all([ new Promise((resolve) => A(() => resolve())), new Promise((resolve) => B(() => resolve())), ]).then(() => { C() }).catch(err => { // handle errors from function A, B and C }) 

我们可以为此同步等待 ,例如:

 async function Foo(){ // function logic } 

而这个Foo的function如下:

 await Foo();