Почему не останавливается таймер? Метод 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/

21 Авг 2019 в 07:02
201 +1
0
Ответы
1

Проблема заключается в том, что внутри функции обратного вызова, переданной в 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);
};

После этого изменения ваш таймер должен корректно останавливаться при достижении необходимого условия.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир