Потеря контекста при передачи в другую функцию
Есть класс консруктор с несколькими методами.
class AlarmClock {
constructor() {
this.alarmCollection = [];
}
addClock(time, func, id) {
let item = { id: id, time: time, callback: func };
this.alarmCollection.push(item);
console.log("Будильник взведен");
}
start() {
let timerId = () => setInterval(this.checkClock(), 0); //неправильная передача данных
this.alarmCollection.forEach(function (item) {
console.table(item);
timerId(item, 0);
});
}
checkClock(item) {
let data = "09:01";
console.log(item);
if (data == item.time) {
item.callback();
}
return "Вызов успешный";
}
}
Создаем новый объект и запускаем несколько методов
let phoneAlarm = new AlarmClock();
phoneAlarm.addClock("09:00", () => console.log("Пора вставать"), 1);
phoneAlarm.addClock("09:01", () => console.log("Давай, вставай уже!"), 2);
phoneAlarm.start();
Проблема заключается в потере конкекста при вызове метода checkClock из start. Пробовал с call как-то это решить, но так и не смог.
Ответы (2 шт):
Автор решения: Pavel Nazarian
→ Ссылка
Только зачем в timerId присваивать функцию? Название переменной странное.
start() {
let timerId = (_item, timer) => setInterval(()=>this.checkClock(_item), timer);
this.alarmCollection.forEach(function (item) {
console.table(item);
timerId(item, 2000);
});
}
Автор решения: Виктор
→ Ссылка
Вот так надо:
class AlarmClock {
constructor() {
this.alarmCollection = [];
}
addClock(time, func, id) {
let item = { id: id, time: time, callback: func };
this.alarmCollection.push(item);
console.log("Будильник взведен");
}
start() {
this.alarmCollection.forEach(
(item) => {
console.table(item);
setInterval(() => this.checkClock(item), 1000);
});
}
checkClock(item) {
console.log("checkClock",item);
item.callback();
}
}
let phoneAlarm = new AlarmClock();
phoneAlarm.addClock("09:00", ()=> console.log("Пора вставать"), 1);
phoneAlarm.addClock("09:01", ()=> console.log("Давай, вставай уже!"), 2);
phoneAlarm.start();