Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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清除另一个函数上的setInterval_Javascript_Settimeout_Intervals - Fatal编程技术网

Javascript 在函数内使用clearInterval清除另一个函数上的setInterval

Javascript 在函数内使用clearInterval清除另一个函数上的setInterval,javascript,settimeout,intervals,Javascript,Settimeout,Intervals,我认为我在clearInterval方法的工作原理上遗漏了一些相当明显的东西 下面的代码就是这样。我希望第一个函数调用执行testFunction,并设置重复该函数的间隔。第二个调用将执行第二个函数,该函数将从第一个函数中删除间隔。由于这将在5000ms间隔之前执行,因此不会再次执行第一个函数。然而,它的行为并非如此 有人能解释一下我的方法有什么问题吗 原因是在我正在编写的程序中,我使用setTimeout每隔30秒左右发出一次重复的get请求,但我希望有一种方法可以轻松地在程序的其他点删除此间

我认为我在clearInterval方法的工作原理上遗漏了一些相当明显的东西

下面的代码就是这样。我希望第一个函数调用执行testFunction,并设置重复该函数的间隔。第二个调用将执行第二个函数,该函数将从第一个函数中删除间隔。由于这将在5000ms间隔之前执行,因此不会再次执行第一个函数。然而,它的行为并非如此

有人能解释一下我的方法有什么问题吗

原因是在我正在编写的程序中,我使用setTimeout每隔30秒左右发出一次重复的get请求,但我希望有一种方法可以轻松地在程序的其他点删除此间隔

function testFunction() {
    $("#test").append("test");
setTimeout(testFunction, 5000);
}
function stopFunction() {
    clearTimeout(testFunction);
}
testFunction();
stopFunction();

setTimeout返回一个ID,因此您应该

var timeoutID = setTimeout(blah blah);
clearTimeout(timeoutID);

setTimeout返回需要传递到clearTimeout方法的对象。有关示例,请参阅本文:

setTimeout
返回计时器的标识符。将其存储在变量中,如:

var timeout;
function testFunction(){
  ...
  timeout = setTimeout(testFunction, 5000);
}
function stopFunction(){
  clearTimeout(timeout);
}

这里是一个简单的,我认为更好的实现

var _timer = null,
    _interval = 5000,
    inProgress = false,
    failures = 0,
    MAX_FAILURES = 3;

function _update() {
    // do request here, call _onResolve if no errors , and _onReject if errors
}

function _start() {
    inProgress = true;
    _update();
    _timer = setInterval(_update, _interval);
}

function _end() {
    inProgress = false;
    clearInterval(_timer);
}

function _onReject(err) {
    if (failures >= MAX_FAILURES) {
        _end();
        return false;
    }
    _end();
    failures++;
    _start();
}

function _onResolve(response) {
    return true;
}

阅读
clearTimeout
的文档。它不使用函数,而是使用计时器的标识符-与
setTimeout
返回的标识符相同,但您只是随意放弃,而不将其保存到变量中<代码>定时器=设置超时(doSomething,time);清除超时(计时器).ahhhh。这很有道理,非常感谢您。如果您执行http请求,您也需要考虑http错误。