我需要调用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) { }
);
答案 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});