我有一个Node.js应用程序,可能会调用多个函数,具体取决于几个因素,但在最后一次回调后只调用最后一个函数。
这是我得到的简化版本:
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);
我想这可以通过使用promises来简化,但我不确定应该如何实现它们。
答案 0 :(得分:7)
你也可以使用when和承诺来做,恕我直言是最容易阅读的。
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');
});
答案 1 :(得分:3)
这是async系列的一种方式。
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");
});
});
答案 2 :(得分:3)
这是使用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, 但是,如果你有很多回调地狱, wait.for是一个很好的方法。