枝!
我正在做一项测试任务,创建" slow_guard"如果传递给slow_guard的另一个函数执行时间太长,应该控制警告消息的函数。
这是我的代码(codepen):
function slow_guard(timeout, fn) {
var timer = setTimeout(function() {
console.log('Function lasts for more than ' + timeout/1000 + ' sec.!');
}, timeout + 1);
var start = new Date().getTime();
fn();
var end = new Date().getTime();
var time = end - start;
console.log('Execution time: ' + time);
clearTimeout(timer);
// if(time < timeout) { clearTimeout(timer); }
}
function longFunction() {
for (i = 0; i < 7999000; ++i) {
// do something
}
}
slow_guard(1000, longFunction);
但它不起作用。似乎clearTimeout不等待循环结束并立即执行
如果我使用Date进行额外的检查,它可以正常工作(您可以检查它是否用较低的注释代替clearTimeout(timer)
代码。)
为什么会这样?!请解释一下!
答案 0 :(得分:1)
setTimeout
会将函数排队以便稍后运行,但如果您正在执行另一个函数,则不会中断它来解析排队函数。
JavaScript引擎在检查队列之前将完成运行slow_guard
(包括clearTimeout
调用)以查看是否有任何定时函数等待(由于你只是清除它。)