在Node.js中等待多个回调 [英] Waiting for multiple callbacks in Node.js

查看:215
本文介绍了在Node.js中等待多个回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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 );
});
});
} 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);

我想这可以通过使用承诺来简化,但是我不知道该怎么实现它们。你也可以使用和承诺,哪个IMHO是最容易阅读的。

  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');
});


I have a Node.js application where multiple funcions might be called, depending on several factors, but only one last function is called after the last callback.

This is a simplified version of what I got:

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");
        });
    });
}

And this is what im doing:

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);

I guess this can be simplified by using promises, however im not sure how should I implement them.

解决方案

You could also do it using when and promises, which IMHO is the easiest to read.

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');
});

这篇关于在Node.js中等待多个回调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆