在Node JS中使用异步调用的系列流被异步调用

时间:2014-06-23 06:54:49

标签: node.js asynchronous

我需要调用x1()系列中的3个函数,然后调用x2()然后x3()。但是由于x1和x2是耗时的操作,x3在它们发出意外结果之前执行。我已使用NodeJS中的async库和series方法,如下所示。 如何在不使用setTimeout for x3()

的情况下解决此问题
async.series([function(callback) {  x1();callback(null, null);},
           function(callback) { x2();callback(null, null);},
            function(callback) { 
                 x3();
                callback(null, null); }],
            function(err, results) { }
    );

3 个答案:

答案 0 :(得分:1)

使用recursive try catch ..

a=true;
while(a){


try{

your work.....


a=false;


}catch(exp ){

a=true
}


}

答案 1 :(得分:0)

您可以使用javascript的异步性质来解决它。这里是如何使用回调完成的。请致电x3()而不是onMethodsDone()。 这里假设x1()接受一个数组。如果您不需要任何参数,请忘记它。 x3()x2()获取修改后的数组,这也是另一个耗时的功能。 setTimeout()用于显示异常行为,因为x1()x2()非常耗时。

x1([1,2],function(results){
    x2(results,onMethodsDone);
});

function onMethodsDone(results){
    alert(results);
}

function x1(records,cb){
    setTimeout(function (){
        records.push(3,4,5);
        cb(records); //parse updated records to callback
    },2000);
}

function x2(records,cb){
    setTimeout(function (){
        records.push(6,7,8);
        cb(records);
    },2000);
}

javascripts监听器或Promise / defers也可用于处理它。

答案 2 :(得分:0)

由于回调函数必须使用不同数量的参数进行重载,因此最佳选择是按如下方式构造方法

function callback(cbargs){
    var arg1 = cbargs.cbarg1;
    var arg2 = cbargs.cbarg2;
    if(arg3!=null){
        .....  
    }
} 
function x1(arg1 , arg2, callback, cbargs){
     .....
     .....
     callback(cbargs);
}
function x3(arg1 , arg2, callback, cbargs){
     .....
     .....
     callback(cbargs);
}
x1(arg1, arg2,callback,{cbarg1, cbarg2});
x1(arg1, arg2,callback,{cbarg1, cbarg2, cbarg3});