async.waterfall在超时后连续执行

时间:2018-01-10 14:24:59

标签: node.js

现在我的代码有这样的结构:

 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”,并且它无法在超时块中返回新值。

1 个答案:

答案 0 :(得分:0)

async.waterfall只是“一次通过”。回调并不是要多次调用。

修复方法是仅在第一个函数中调用callback()一次。您可以将其放在每个if-blocks中,如果是someCondition2,则将回调放入timeout()

只要它不是双重调用它就是一个有效的瀑布,并且将它置于超时内将“等待”直到超时运行,然后沿着瀑布前进。

相关问题