Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Бесконечный вызов функции (https://javascript.ru/forum/jquery/36125-beskonechnyjj-vyzov-funkcii.html)

Dimaz 04.03.2013 19:49

Бесконечный вызов функции
 
Приветствую всех. Столкнулся с такой проблемой. Написал скрипт таймера, активирующийся по нажатию на кнопку. Но если не дождавшись окончания отсчета, второй раз нажать по кнопке, функция будет вызываться бесконечно.
var x;
$('button').click(function(){
    var y = 5;
x = setInterval(function(){$('p').text(y); if(y>0){y--} else{Run()}},1000);
});
             function Run(){
                 clearInterval(x);
    console.log("error");
}

Вот ссылка на скрипт http://jsfiddle.net/nCT3B/

Dimaz 04.03.2013 19:57

Все, дошло. Просто уже плохо соображаю к вечеру. Извиняюсь. Тему можно удалить. Вот ответ:
if(x){return false;}

Dimaz 05.03.2013 13:24

Вопрос снова открыт. Метод clearInterval() как выяснилось не очищает переменную с интервалом, а записывает туда какие-то числовые значения. Что они означают я так и не понял. При чем как до очистки интервала так и после, значение тоже самое. С каждым новым запуском таймера, это значение увеличивается на единицу. Но у меня на сервере это значение по какой-то причине увеличивается на 2, а не на 1. Что означают эти цифры?

danik.js 05.03.2013 13:27

это идентификатор таймера. clearInterval ничего туда не записывает, и вобще не меняет саму переменную (с чего бы, да и невозможно это)

Dimaz 05.03.2013 13:32

Цитата:

Сообщение от danik.js (Сообщение 238885)
это идентификатор таймера. clearInterval ничего туда не записывает, и вобще не меняет саму переменную (с чего бы, да и невозможно это)

Если не записывает тогда почему я не могу запустить таймер заново? Делаю проверку
if(x){return false;}
Условие всегда истинно, даже после окончания отсчета и очистки интервала. console.log(x) выводит как раз таки эти числа.

danik.js 05.03.2013 13:41

Цитата:

Сообщение от Dimaz
Условие всегда истинно

Ну да, а почему оно должно быть ложным? Вы наверно не читаете что вам пишут. В x содержится идентификатор таймера (возвращенный функцией setInterval). То есть число. И оно больше нуля. Проверка if (x) выполнится. clearIterval число не изменяет как я говорил.

Dimaz 05.03.2013 13:50

Т.е. после clearInterval() нужно поставить x=""?
Да, кстати еще на счет моего первого поста. Просто ради интереса, почему функция зациклилась? Я же каждый раз очищаю интервал. Интервалы где-то в глобальной области сохраняются?

danik.js 05.03.2013 13:57

Цитата:

Сообщение от Dimaz
Т.е. после clearInterval() нужно поставить x=""?

Ну как вариант. Только принято писать x = null;
Код по ссылке нигде не зацикливается, не знаю о чем вы. Считает до 0 и останавливается.

Dimaz 05.03.2013 14:34

Цитата:

Сообщение от danik.js (Сообщение 238902)
Ну как вариант. Только принято писать x = null;
Код по ссылке нигде не зацикливается, не знаю о чем вы. Считает до 0 и останавливается.

А вы нажмите два раза на кнопку и посмотрите в консоли. Будет выводиться бесконечно сообщение error.

Dimaz 05.03.2013 14:43

Как я понимаю это. Вы сказали, что каждый раз присваивается новый id интервала. Двойное нажатие кнопки запускает два интервала где-то в глобальной области. Затем clearInterval очищает второй запущенный интервал, а первый остается рабочим навсегда. Правильное мышление?


Часовой пояс GMT +3, время: 12:53.