programing

JavaScript clearTimeout이 작동하지 않습니다.

powerit 2023. 11. 4. 13:21
반응형

JavaScript clearTimeout이 작동하지 않습니다.

(유사한 질문/답변을 모두 살펴보았지만 어느 것도 제 문제를 해결하지 못합니다.

코드:

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초 훨씬 전에 타이머 스레드가 아직 실행 중인 것 같습니다.위의 코드에 문제가 있습니까?아니면 다른 코드에 문제가 있을 수도 있습니다.

edit: 추가해야 합니다.showLoader(true)서버에서 응답하기 전에 다시(그리고 다시) 호출할 수 있습니다.

당신은 체크를 추가해서 이미 존재하는지 확인해야 합니다.timeoutHandle새로운 것을 만들기 전에.

시도해 보십시오.

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

그리고 또 다른 경우에는timeoutHandle다음과 같이 삭제한 후 null로 변경합니다.

clearTimeout(timeoutHandle);
timeoutHandle = null;

이렇게 하면 다음과 같은 경우에 동시에 타임아웃을 생성할 수 있는 기회가 사라집니다.showLoader(true)함수를 두 번 이상 호출합니다.

여러 개의 전화를 걸고 있는 경우가 있습니다.showLoader이 기능은 글로벌 기능이기 때문에 어디서나 액세스할 수 있기 때문에 일반적으로 원하지 않습니다.

모나드 구현으로 변경하는 것을 고려해 보겠습니다.

function create_loader(elem) {
    var handle = null;

    function show() {
        elem.html('Loading...');
        elem.show();

        if (handle !== null) {
            clearTimeout(handle); // clear the previous one
        }
        handle = setTimeout(function () {
            elem.html('Still loading...');
        }, 15000);
    }

    return {
        show: show,
        clear: function () {
            elem.hide();
            clearTimeout(handle);
            handle = null;
        }
    };
}

용도:

var loader = create_loader($(".loader"));
loader.clear();
loader.show();
loader.show(); // each new call to show will reset the 15s timer
loader.show();
loader.show();
loader.clear();
// and you can make another one that operates independently of other one
var another_loader = create_loader($(".anotherLoader"));

이제 당신은.loader자신의 상태를 알고 있는 물체입니다.

당신의 게시물에서 쇼로더는 첫 번째 반환 전에 여러 번 호출될 수 있다고 언급합니다.이것은 당신의 문제입니다.기존의 핸들을 파괴하지 않고 새 핸들로 기존의 timeoutHandle을 덮어씁니다.새로 생성하기 전에 timeoutHandle이 설정되어 있는지 확인해야 합니다.

clearTimeout(timeoutHandle)을 호출하지 않은 다음 timeoutHandle이 있는 경우 새 요청을 시작합니다.

언급URL : https://stackoverflow.com/questions/17368453/javascript-cleartimeout-not-working

반응형