>

일정 시간이 지난 후에 작업을 실행할 스크립트를 만들고 있습니다. 사용자가 이러한 작업의 실행을 취소 할 수 있기를 바랍니다. 시간 초과를 목록에 저장하여 모든 시간 초과를 취소하는 데 사용하면됩니다. 하지만 타임 아웃이 정상적으로 완료되면 여전히 해당 목록에 저장됩니다.

제한을 시도하기 전에 타임 아웃이 이미 완료 또는 취소되었는지 어떻게 확인합니까?

var timeouts = [];
$(document).on('click', '.doTask', function() {
    var timeout = setTimeout(() => {
        doTaskAfter();
    }, 10000);
    timeouts.push(timeout);
});
$(document).on('click', '.cancelTasks', function() {
    var i = timeouts.length;
    while (i--) {
        if (timeouts[i].finished || timeouts[i].timeoutCleared) { // How to I check this?
            clearTimeout(timeouts[i]);
        }
        timeouts.splice(i, 1);
    }
});


  • 답변 # 1

    약속으로 할 수 있다고 생각합니다.

    타이머를 생성하고 약속 안에 넣은 다음 그 약속을 배열에 넣습니다. 타이머가 실행되면 약속이 해결됩니다.

    말 그대로 타이머를 작성하십시오.

      setTimeout(() => {
           resolve("True");
        }, 10000);
    
    

    여기서 할 수있는 일은 이것입니다. 코드를 살펴볼 때는 promise.race와 함께 false를 반환하는 두 번째 약속을 사용하십시오.

    let race = [timeouts[i],Promise.resolve("False") ]
    
    

    약속이 해결되었는지 확인하려면 Promise.race를 사용하십시오. 둘 다 해결되면 Promise.race가 첫 번째 약속을 반환하고 "True"를 반환하기 때문에 작동합니다. 타이머가 여전히 꺼져 있으면 false를 반환합니다.

    Promise.race(race).then((res, rej) => {
    if(res === true) {
    clearTimeout(timeouts[i]);
    }
    })
    
    

  • 답변 # 2

    올바로 이해했는지 모르겠지만 이미 완료된 시간 초과를 제거하는 이유는 무엇입니까?

    시간이 초과되면 배열에서 자신을 제거 할 수 있습니다.

    timeouts.splice(timeouts.indexOf(timeout), 1);
    
    
    그렇지 않으면 clearTimeout 를 사용할 수 있습니다  그리고 splice  제한 시간 목록에서 등록/실행 제한 시간을 모두 종료합니다.

    var timeouts = [];
    $(document).on('click', '.doTask', function() {
        var timeout = setTimeout(() => {
            doTaskAfter();
            timeouts.splice(timeouts.indexOf(timeout), 1); // <=== HERE
        }, 10000);
        timeouts.push(timeout);
    });
    $(document).on('click', '.cancelTasks', function() {
        var i = timeouts.length;
        while (i--) {
            clearTimeout(timeouts[i]);
            timeouts.splice(i, 1);
        }
    });
    
    

  • 답변 # 3

    중요하거나 중요하지 않은 한 가지는 clearTimeout 에 전화하는 것입니다  이미 지워지거나 완료된 시간 초과시 아무 작업도 수행하지 않으므로 시간을 추적하지 않아도됩니다.

    그렇지 않으면 다음과 같이 상태를 추적 할 수 있습니다.

    var timeouts = [];
    $(document).on('click', '.doTask', function() {
        var timeout = { state: 'waiting' };
        timeout.id = setTimeout(() => {
            timeout.state = 'finished';
            doTaskAfter();
        }, 10000);
        timeouts.push(timeout);
    });
    $(document).on('click', '.cancelTasks', function() {
        var i = timeouts.length;
        while (i--) {
            if (timeouts[i].state !== 'finished' && timeouts[i].state !== 'canceled') {
                // i.e. timeouts[i].state is 'waiting'
                clearTimeout(timeouts[i].id);
                timeouts[i].state = 'canceled';
            }
            timeouts.splice(i, 1);
        }
    });
    
    

  • 이전 shell - ZSH에서 디렉토리로 이동 (bash)
  • 다음 javascript - AWS Lambda 함수 내부에서이 aws-sdk 함수를 볼 수없는 이유는 무엇입니까?