Mik*_*yne 2 callback node.js promise q
我一直在使用 Q 模块来实现我正在从事的项目的承诺。我使用静态方法 Q.fncall() 从 node.js 样式函数创建承诺(基于返回 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);
}
);
Run Code Online (Sandbox Code Playgroud)
和 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;
});
Run Code Online (Sandbox Code Playgroud)
}
在我的理想情况下,setTimeout(...,2000) 中的代码永远不应该被执行。这可能吗?
提前致谢。
我认为你对自己的关注度太低了。一旦您运行了test1,就无法停止db_rw_pool.query执行,也无法停止调用其回调(除非您在此db_rw_pool.query方法中采取特殊的预防措施)。SQL 查询的结果将会返回。问题是代码是否会在某个时刻吞掉这些结果。本例中的吞咽发生在 Qtimeout方法的代码中。只需将您不想执行的任何代码放入 的 onFulfilled 处理程序中即可done。
你写
问题是我需要在一段时间后停止执行该函数,所以我使用了Q模块的“超时”函数。
超时方法不会阻止该函数的执行。相反,它会返回一个新的承诺,如果它所绑定的承诺(您使用 做出的承诺Q.nfcall)未在设定的时间段(本例中为 1000 毫秒)内实现,则指示该承诺失败。
如果您想以某种方式阻止回调执行,您可以将其包装在一个检查时间的函数中。就像是:
function stopExecutingAfter(timeout, fn) {
var stopifAfter = Date.now() + timeout
return function() {
if(Date.now() > stopIfAfter) return
fn.apply(null, arguments)
}
}
Run Code Online (Sandbox Code Playgroud)
Q 主要关注承诺,所以很明显它不会为你做这件事。使用这种技术,您可以创建一个nfcallWithTimeout返回 Promise 的函数,同时保护传递的函数(通过将其包装在类似上面的内容中)。那么您就不必两次配置超时行为。
| 归档时间: |
|
| 查看次数: |
1957 次 |
| 最近记录: |