Почему не останавливается таймер? Метод 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)
};
После этого изменения ваш таймер должен корректно останавливаться при достижении необходимого условия.