Javascript 当一个线程通过clearInterval被终止时,有没有办法执行一些代码?
对于通过setInterval运行的特定线程,是否有类似于“dispose”函数或“threadshutdownhook”的功能Javascript 当一个线程通过clearInterval被终止时,有没有办法执行一些代码?,javascript,Javascript,对于通过setInterval运行的特定线程,是否有类似于“dispose”函数或“threadshutdownhook”的功能 (function () { var _setInterval = window.setInterval, _clearInterval = window.clearInterval; window.setInterval = function (fn, time) { //Implement your hooks
(function () {
var _setInterval = window.setInterval,
_clearInterval = window.clearInterval;
window.setInterval = function (fn, time) {
//Implement your hooks here, hopefully without side effects
return _setInterval(fn, time);
};
window.clearInterval = function (id) {
//Implement your hooks here, hopefully without side effects
return _clearInterval(id);
};
})()
从评论中可以清楚地看出,你不需要钩住,因为你处在一个你可以控制的环境中。在这种情况下,您可以使用相同的原理编写包装器函数,如myClearInterval
等
从评论中可以清楚地看出,你不需要钩住,因为你处在一个你可以控制的环境中。在这种情况下,您可以使用相同的原则编写包装器函数,如
myClearInterval
等。首先,正如其他人所说,javascript中没有线程(除了WebWorkers,但我不认为这是您在这里讨论的内容)
所有setInterval()
确实是在重复的基础上调用一个函数-它不是一个线程,它不是先发制人的,在所有其他javascript停止执行之前它不会被调用,因此计时器事件可以被处理。如果您的问题是希望在清除时间间隔时处理某些状态,这样它就不会被调用,那么您有两个选项:
1) 您可以使用javascript闭包来存储状态,当间隔被清除时,闭包将自动释放
2) 您可以创建自己版本的clearInterval,它既可以清除间隔计时器,也可以清除您的状态
javascript闭包选项如下所示:
var interval;
function startMyInterval() {
// sample state variables
var state1 = 0;
var state2 = [];
var state3 = {whatever: "whatever"};
interval = setInterval(function() {
// javascript code here that can reference state1, state2 and state3
}, 1000);
}
// then some time later when you want to stop the interval, you call clearInterval
// the closure is released and all the state variables are freed automatically
clearInterval(interval);
或者,如果您想在清除间隔时执行任何其他操作,您可以创建自己的函数来清除间隔,该函数不仅可以释放闭包,还可以让您运行任何其他代码
function clearMyInterval() {
clearInterval(interval);
// do any other cleanup you want to when the interval is stopped
}
我看到其他人建议用您自己的函数挂起/替换window.clearInterval(),但我不喜欢这样做,因为不清楚这是否是一个受支持/记录的功能,并且一些系统函数(随着时间的推移越来越多)受到保护,因此无法被替换。首先,正如其他人所说,javascript中没有线程(除了WebWorkers,但我不认为这是您在这里讨论的内容) 所有
setInterval()
确实是在重复的基础上调用一个函数-它不是一个线程,它不是先发制人的,在所有其他javascript停止执行之前它不会被调用,因此计时器事件可以被处理。如果您的问题是希望在清除时间间隔时处理某些状态,这样它就不会被调用,那么您有两个选项:
1) 您可以使用javascript闭包来存储状态,当间隔被清除时,闭包将自动释放
2) 您可以创建自己版本的clearInterval,它既可以清除间隔计时器,也可以清除您的状态
javascript闭包选项如下所示:
var interval;
function startMyInterval() {
// sample state variables
var state1 = 0;
var state2 = [];
var state3 = {whatever: "whatever"};
interval = setInterval(function() {
// javascript code here that can reference state1, state2 and state3
}, 1000);
}
// then some time later when you want to stop the interval, you call clearInterval
// the closure is released and all the state variables are freed automatically
clearInterval(interval);
或者,如果您想在清除间隔时执行任何其他操作,您可以创建自己的函数来清除间隔,该函数不仅可以释放闭包,还可以让您运行任何其他代码
function clearMyInterval() {
clearInterval(interval);
// do any other cleanup you want to when the interval is stopped
}
我看到其他人建议用您自己的函数挂起/替换window.clearInterval(),但我不喜欢这样做,因为不清楚这是否是一个受支持/记录的功能,并且一些系统函数(随着时间的推移越来越多)正在受到保护,因此无法替换它们。让您忘记线程
setInterval
不适用于线程,而且大多数情况下,Javascript没有线程的概念。请忘记线程setInterval
不适用于线程,大多数情况下,Javascript没有线程概念。这是一个良好的开端,除了setInterval()
在延迟后接受零个或多个可选参数。可能值得做一些类似于\u setInterval.apply(窗口,参数)
的事情(在本例中,参数将包含传递给窗口.setInterval
的所有参数)。@LachlanMcDonald我没有这样做,因为IE7没有对主机对象应用/调用。可选参数是非标准的AFAIK。除此之外,咖喱的使用也很简单,我基本上是这样做的(clearInterval/setInterval函数的包装器)。谢谢@埃萨利亚。啊,这两件事我都不知道。我想,如果Don的代码不在使用这些额外参数的环境中,那也没什么大不了的。你有多确定现在和将来在所有浏览器中都可以用自己的版本替换window.clearInterval()
和window.setInterval()
?随着时间的推移,是否有越来越多的移动来保护某些系统功能,使其无法被替换?这是一个良好的开端,除了setInterval()
在延迟后接受零个或多个可选参数。可能值得做一些类似于\u setInterval.apply(窗口,参数)
的事情(在本例中,参数将包含传递给窗口.setInterval
的所有参数)。@LachlanMcDonald我没有这样做,因为IE7没有对主机对象应用/调用。可选参数是非标准的AFAIK。除此之外,咖喱的使用也很简单,我基本上是这样做的(clearInterval/setInterval函数的包装器)。谢谢@埃萨利亚。啊,这两件事我都不知道。我想,如果Don的代码不在使用这些额外参数的环境中,那也没什么大不了的。你有多确定现在和将来在所有浏览器中都可以用自己的版本替换window.clearInterval()
和window.setInterval()
?随着时间的推移,是否有越来越多的移动来保护这些系统功能,使它们无法被替换?@DonRhummy-您显然误解了setInterval()
和setTimeout()
的工作原理。他们是