JavaScript clearTimeout不起作用

use*_*119 14 javascript ajax jquery

(我看过所有类似的问题/答案,但没有一个能解决我的问题.)

代码:

var timeoutHandle;

function showLoader(show) {
    if (show) {
        $('.loader').html('Loading...');
        $('.loader').show();

        timeoutHandle = setTimeout(function () {
            if ($('.loader').is(':visible')) {
                $('.loader').html('Still loading...');
            }
        }, 15000);
    }
    else {
        $('.loader').hide();
        clearTimeout(timeoutHandle);
    }
}
Run Code Online (Sandbox Code Playgroud)

AJAX函数只是showLoader(true)在调用服务器之前调用,然后showLoader(false)在结果之后调用.我有时会在15秒之前看到文本从"正在加载..."更改为"仍然加载...",因此就好像计时器线程仍在运行一样.上面的代码有什么问题吗?或者问题可能与其他代码有关..

编辑:我必须添加,showLoader(true)可以在服务器响应之前再次(再次)调用

Div*_*com 21

timeoutHandle在创建新的之前,您应该添加一个检查以查看是否已有.

试试这个:

if(timeoutHandle){
    clearTimeout(timeoutHandle);
    timeoutHandle = null;
}
timeoutHandle = setTimeout(function () {
    if ($('.loader').is(':visible')) {
        $('.loader').html('Still loading...');
    }
}, 15000);
Run Code Online (Sandbox Code Playgroud)

然后在其他情况下设置timeoutHandle为null后清除它像这样:

clearTimeout(timeoutHandle);
timeoutHandle = null;
Run Code Online (Sandbox Code Playgroud)

如果showLoader(true)多次调用函数,这将消除创建并发超时的可能性.

  • 没有必要检查.只需调用`clearTimeout`即可 (11认同)
  • 它对我不起作用:一旦 timeoutHandle 在被清空后受到影响,时间计数不会从头开始,但似乎会从被清空之前的位置继续! (4认同)