承诺超时后停止执行

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

问题是我需要在一定的时间内停止执行这个函数,所以我使用了Q模块的“超时”function。 所以,经过了一段时间后,done函数的“错误”callback就会执行,让我来处理超时,但是函数本身不断的执行,直到它到达最后的callback,即使处理程序不再监听。

问题是:是否有任何方法来执行超时后停止执行一个函数? 我知道我可以在超时处理程序上设置一个variables,并在超时结束的时候继续检查函数,但是我希望能有一个更清晰的方法来实现。

代码如下:

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)中的代码不应该被执行。 这可能吗?

提前致谢。

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

你写

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

超时方法不会停止执行此function。 相反,它会返回一个新的承诺,如果在设定的时间内(在这种情况下为1000毫秒)内没有履行与Q.nfcall承诺,则被指示失败。

如果你想以某种方式停止执行callback,你可以把它包装在一个函数中检查时间。 就像是:

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

Q主要关注承诺,所以很明显它不会为你做这件事。 使用这种技术,你可以创build一个nfcallWithTimeout函数来返回一个promise,同时保护传入的函数(通过包装类似上面的东西)。 那么你不必两次configuration超时行为。