现在我的代码有这样的结构:
async.waterfall([
function(callback){
if(someCondition1) {
//do something
if(someCondition2)){
result1 = something
var timeout = null;
timeout = setTimeout(function(){
//do something
result1 = newValue;
},timeout);
}
else{
// do something
result1 = something;
}
}
else {
//do something
result1 = something;
}
callback(null,result1);
},
function (result1, callback) {
//do something
result2 = something;
callback(null,result2);
},
function (result2, callback){
//do something
}], function (err,result) {
});
我想在瀑布的第一个函数中实现超时。我的意图是代码将在第一次尝试时将变量result1解析为第二个瀑布函数。超时时,代码将再次检查变量result1并在必要时用新值覆盖它,然后再次将此新result1解析为第二个函数并再运行一次。
使用我当前的实现,当没有超时时,代码正常执行。但是,在超时时获取result1的新值后,代码会立即停止,并且不会使用新的result1值执行waterfall的其余功能。有没有办法实现预期的行为?非常感谢提前。
修改
我尝试了答案中的建议。现在代码看起来像这样:
async.waterfall([
function(callback){
if(someCondition1) {
//do something
if(someCondition2)){
//I want to return this result1 before timeout
result1 = something;
var timeout = null;
timeout = setTimeout(function(){
//do something
result1 = newValue;
callback(null,result1);
},timeout);
}
else{
// do something
result1 = something;
callback(null,result1);
}
}
else {
//do something
result1 = something;
callback(null,result1);
}
},
function (result1, callback) {
//do something
result2 = something;
callback(null,result2);
},
function (result2, callback){
//do something
}], function (err,result) {
});
我想在超时之前回调result1,并且在超时之后它将回调新的result1值。如果我保留上面的代码,代码显然会等到超时并返回新的result1值。但是,如果我在超时之前将result1放入回调中,那么当超时到期时我将面临错误“已经调用Callback”,并且它无法在超时块中返回新值。
答案 0 :(得分:0)
async.waterfall
只是“一次通过”。回调并不是要多次调用。
修复方法是仅在第一个函数中调用callback()
一次。您可以将其放在每个if-blocks
中,如果是someCondition2
,则将回调放入timeout()
。
只要它不是双重调用它就是一个有效的瀑布,并且将它置于超时内将“等待”直到超时运行,然后沿着瀑布前进。