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

编码:

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);
    }
}

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

编辑:我必须补充一点,在服务器响应之前,可以再次(反复)调用showLoader(true)

最佳答案

在创建新的timeoutHandle之前,您应该添加一项检查以查看是否已经存在timeoutHandle

试试这个:

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

然后在其他情况下,将其清除后将showLoader(true)设置为null,如下所示:
clearTimeout(timeoutHandle);
timeoutHandle = null;

如果ojit_code函数被多次调用,这将消除您创建并发超时的机会。

10-08 16:44