在承诺超时后停止执行

时间:2013-05-10 09:27:12

标签: node.js callback promise q

我一直在使用Q模块来实现我正在进行的项目的承诺。 我正在使用静态方法Q.fncall()从node.js样式函数创建一个promise(基于返回错误的回调,结果)。

问题是我需要在一段时间后停止执行所述函数,所以我使用了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)中的代码。这可能吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

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

你写

  

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

超时方法不会停止执行此功能。相反,如果在设定的时间段内(在这种情况下为1000毫秒)未达到它所绑定的承诺(您使用Q.nfcall创建的承诺),它将返回一个新的承诺,指示失败。

如果你想以某种方式阻止执行回调,你可以将它包装在一个检查时间的函数中。类似的东西:

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

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

答案 1 :(得分:0)

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

相关问题