Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当一个线程通过clearInterval被终止时,有没有办法执行一些代码?_Javascript - Fatal编程技术网

Javascript 当一个线程通过clearInterval被终止时,有没有办法执行一些代码?

Javascript 当一个线程通过clearInterval被终止时,有没有办法执行一些代码?,javascript,Javascript,对于通过setInterval运行的特定线程,是否有类似于“dispose”函数或“threadshutdownhook”的功能 (function () { var _setInterval = window.setInterval, _clearInterval = window.clearInterval; window.setInterval = function (fn, time) { //Implement your hooks

对于通过setInterval运行的特定线程,是否有类似于“dispose”函数或“threadshutdownhook”的功能

(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()
的工作原理。他们是