【问题标题】:Stop execution after promise times out承诺超时后停止执行
【发布时间】:2013-05-04 22:49:27
【问题描述】:

我一直在使用 Q 模块来实现我正在从事的项目的承诺。 我正在使用静态方法 Q.fncall() 从 node.js 样式函数中创建一个 Promise(基于返回 err、result 的回调)。

问题是我需要在一定时间后停止执行该函数,所以我使用了Q模块的函数“超时”。因此,在 x 时间后,完成函数上的“错误”回调执行,让我处理超时,但即使处理程序不再监听,函数本身也会继续执行,直到达到最终回调。

问题是:有没有办法在执行超时后停止函数的执行?我知道我可以在超时处理程序上设置一个变量,并在超时结束时继续检查函数,但我希望有一种更简洁的方法来实现这一点。

代码如下:

        Q.nfcall(test1, id)
        .timeout(1000)
        .done(
            function (value) {
                console.log("SUCCESS: " + value);
            }, 
            function (reason) {
                console.log("ERROR " + reason);
            },
            function (progress) {
                console.log("PROGRESS " + progress);
            }
        );

还有test1函数:

function test1(id,callback){
db_rw_pool.query("SELECT * FROM table WHERE id=?",[id], function(err,result) {
    if(err){
        callback(err,null);
    }
    else {
        setTimeout(function(){
            console.log("I DON'T WANT YOU TO BRE PRINTED")
            callback(null,result);
        },2000);

    }
    return;
});

}

在我的理想情况下,setTimeout(...,2000) 中的代码永远不应该被执行。这可能吗?

提前致谢。

【问题讨论】:

    标签: node.js callback promise q


    【解决方案1】:

    考虑使用另一种语言,因为在 Javascript 中无法做到这一点。

    【讨论】:

    • 上面的答案另有说明。
    【解决方案2】:

    我认为你对自己的关注程度太低了。一旦你运行了test1,就无法阻止db_rw_pool.query 的执行,以及它的回调被调用(除非你在这个db_rw_pool.query 方法中采取了特殊的预防措施)。 SQL 查询的结果将返回。问题是代码是否会在某个时候吞下这些结果。这种情况下的吞咽发生在 Q 的 timeout 方法的代码中。只需将您不想执行的任何代码放在done 的 onFulfilled 处理程序中即可。

    你写

    问题是我需要在一定时间后停止执行该函数,所以我使用了Q模块的“超时”函数。

    超时方法不会阻止此函数执行。相反,它会返回一个新的 Promise,如果它所绑定的 Promise(您使用 Q.nfcall 做出的承诺)未在设定的时间段内(在本例中为 1000 毫秒)内实现,则会返回一个新的 Promise。

    如果您想以某种方式阻止回调执行,您可以将其包装在一个检查时间的函数中。比如:

    function stopExecutingAfter(timeout, fn) {
      var stopifAfter = Date.now() + timeout
      return function() {
        if(Date.now() > stopIfAfter) return
        fn.apply(null, arguments)
      }
    }
    

    Q 主要关注承诺,所以很明显它不会为你做这件事。 使用这种技术,您可以创建一个nfcallWithTimeout 函数,该函数返回一个承诺,同时保护传递的函数(通过将其包装在类似上面的东西中)。这样你就不必配置两次超时行为了。

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 1970-01-01
      • 2018-03-18
      • 2019-09-08
      • 2016-03-07
      • 2018-11-07
      • 2017-02-18
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多