Почему не останавливается таймер? Метод 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/
Проблема заключается в том, что внутри функции обратного вызова, переданной в setInterval, контекст this теряется, поэтому при попытке вызвать метод stop() на объекте Worker, он не может быть найден.
Вы можете исправить это, привязав правильный контекст к функции обратного вызова с помощью метода bind. Вот как это можно сделать:
this.start = function() { if (working) return; position = 0; timer = window.setInterval(function() { position += step; on_step(position, from, to); if (position >= to) { console.log('end1'); this.stop(); // Здесь используем this, чтобы вызвать метод stop() } }.bind(this), interval); // Привязываем правильный контекст к функции обратного вызова on_start(); working = true; on_step(position, from, to); };
После этого изменения ваш таймер должен корректно останавливаться при достижении необходимого условия.
Проблема заключается в том, что внутри функции обратного вызова, переданной в setInterval, контекст this теряется, поэтому при попытке вызвать метод stop() на объекте Worker, он не может быть найден.
Вы можете исправить это, привязав правильный контекст к функции обратного вызова с помощью метода bind. Вот как это можно сделать:
this.start = function() {if (working) return;
position = 0;
timer = window.setInterval(function() {
position += step;
on_step(position, from, to);
if (position >= to) {
console.log('end1');
this.stop(); // Здесь используем this, чтобы вызвать метод stop()
}
}.bind(this), interval); // Привязываем правильный контекст к функции обратного вызова
on_start();
working = true;
on_step(position, from, to);
};
После этого изменения ваш таймер должен корректно останавливаться при достижении необходимого условия.