@artem78

Почему не останавливается таймер?

Метод start создаёт таймер, который выполняет функцию нужное кол-во раз. Если дошли до конца, вызывается метод stop, в котором происходит остановка таймера..

function Worker(opts) {
  // ...

  this.start = function() {
    //console.log(interval);
    if (working) return;
  
    position = 0;
    timer = window.setInterval(function() {
      //console.log('timer');
      position += step;
      on_step(position, from, to);
      if (position >= to) {
        console.log('end1');
        self.stop();
      }
    }, interval);
    on_start();
    working = true;
    on_step(position, from, to);
  };
  
  this.stop = function() {
    сonsole.log('end2');
    if (!working) return;
    
    //console.log(timer);
    window.clearInterval(timer);
    working = false;
    on_end();
  };

  // ...
}


По какой-то причине, таймер не останавливается. Не происходит вызов stop() - в консоль firebug пишет end1, но end2 нет. Ошибок никаких не выводит.

https://jsfiddle.net/crazzzy/o940649p/
  • Вопрос задан
  • 281 просмотр
Решения вопроса 1
Stalker_RED
@Stalker_RED
Потому что self.stop();, и при этом переменная self не объявлена.

Так вот работает: https://jsfiddle.net/o940649p/2/

P.S: Когда-то делал похожую штуку, можете посмотреть https://jsfiddle.net/Stalk/mLu8v4k6/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Можно так:
this.start = function() {
  	//console.log(interval);
  	if (working) return;
  
  	position = 0;
  	timer = window.setInterval(function(self) {
    	//console.log('timer');
    	position += step;
      on_step(position, from, to);
      if (position >= to) {
      	console.log('end1');
      	self.stop();
      }
    }.bind(null, this), interval);
    on_start();
    working = true;
    on_step(position, from, to);
  };


Или так:
this.start = function() {
  	//console.log(interval);
  	if (working) return;
  
  	position = 0;
  	timer = window.setInterval(function() {
    	//console.log('timer');
    	position += step;
      on_step(position, from, to);
      if (position >= to) {
      	console.log('end1');
      	this.stop();
      }
    }.bind(this), interval);
    on_start();
    working = true;
    on_step(position, from, to);
  };

Во всех этих интервалах контекстом по умолчанию идет переменная window.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы