等待Node.js中的多个callback

我有一个Node.js应用程序可能会调用多个函数,这取决于几个因素,但最后一次callback后只会调用最后一个函数。

这是我得到的简化版本:

if(foo === bar){ function1(arg1, function(val1){ doWhatever(val1, function(){ res.end("Finished"); }); }); }else if(foo === baz){ function2(arg2, function(val2){ doWhatever(val2, function(){ res.end("Finished"); }); }); }else{ function3(arg3, function(val3){ doWhatever(val3, function(){ res.end("Finished"); }); }); } 

这就是即将做的事情:

 var finished = false; if(foo === bar){ function1(arg1, function(val1){ result = val1; finished = true; }); }else if(foo === baz){ function2(arg2, function(val2){ result = val2; finished = true; }); }else{ function3(arg3, function(val3){ result = val3; finished = true; }); } var id = setInterval(function(){ if(finished === true){ clearInterval(id); doWhatever(result, function(){ res.end("Finished"); }); } }, 100); 

我想这可以通过使用承诺简化,但我不知道如何实现它们。

你也可以使用时间和承诺,恕我直言,这是最容易阅读。

 var promises = []; if(x) { var deferred1 = when.defer(); doSomethingAsync({ callback: deferred1.resolve }); promises.push(deferred1.promise); } else if(y) { var deferred2 = when.defer(); doSomethingAsync({ callback: deferred2.resolve }); promises.push(deferred2.promise); } else if(z) { var deferred3 = when.defer(); doSomethingAsync({ callback: deferred3.resolve }); promises.push(deferred3.promise); } when.all(promises).then(function () { console.log('Finished Promises'); }); 

这是asynchronous系列的一种方法。

https://github.com/caolan/async#series

 async.series([ function(callback){ if(foo === bar){ function1(arg1, function(val1){ callback(null, val1); }); }else if(foo === baz){ function2(arg2, function(val2){ callback(null, val2); }); }else{ function3(arg3, function(val3){ callback(null, val3); }); } } ], function(error, valArray){ doWhatever(valArray[0], function(){ res.end("Finished"); }); }); 

这里使用wait.for

https://github.com/luciotato/waitfor

 //in a fiber var result; if(foo === bar){ result = wait.for(function1,arg1); }else if(foo === baz){ result = wait.for(function2,arg2); }else{ result = wait.for(function3,arg3); }; doWhatever(result, function(){ res.end("Finished"); }); 

你需要在一个光纤(或发生器)使用wait.for,但是,如果你有很多callback地狱,wait.for是一个好方法。