承诺超时后停止执行
我一直在使用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超时行为。