clearTimeout не работает с несколькими функциями - PullRequest
0 голосов
/ 02 мая 2019

clearTimeout не работает в моем коде. Я определил переменную глобальную, поэтому каждая функция должна иметь к ней доступ. Вот мой код для лучшего понимания (см. Комментарии в коде):

$(document).on('click', '#submit', function() { /* SECOND CLICK IS AFTER ~2 SECONDS */
    var timeout;

    validation();

    mysql();

    function validation() {
        if (condition) {
            if (timeout) {
                console.log('timeout set');
            } else {
                console.log('timeout not set'); /* GET THIS BUT TIMEOUT MADE CHANGE AFTER DEFINED TIME */

            clearTimeout(timeout);

            if (timeout) {
                console.log('timeout set');
            } else {
                console.log('timeout not set'); /* GET THIS */
            }
        }   
    }

    function mysql() {
        $.ajax({
            type: 'POST',
            url: $(form).attr('action'),
            dataType: 'json',
            data: formData,
            contentType: false,
            processData: false,
            success: function(response) {
                timeout = setTimeout(function() {
                    $('.message').html('message for user');
                }, 7500);
            }
        })
    }
});

1 Ответ

1 голос
/ 02 мая 2019
$(document).on('click', '#submit', function() { /* SECOND CLICK IS AFTER ~2 SECONDS */
    var timeout;

Проблема в вашей сфере действия для timeout. Он ограничен обработчиком события click. Таким образом, каждый раз, когда вы выполняете эту логику щелчка, он создает новый экземпляр для контекста. Если вы хотите совместно использовать одну переменную тайм-аута для всех кликов, ее необходимо переместить в более высокую область вне обработчика событий.

Для более подробного вопроса о области видимости переменных в javascript, пожалуйста, обратитесь: Какова область видимости переменных в JavaScript?

...