Как остановить таймер?

товарищи, бьюсь несколько дней, гуглю, ищу, но нифига не понимаю почему у меня не убивается таймер
const pool = [];

function Some() {
  this.id = uuid();
  this.timer = setInterval(() => {
    console.log('чем-то гажу в консоль');
  }, 1000 * 1);
  this.stop = () => {
    clearInterval(this.timer);
  };
}

var http = require('http');
var bodyParser = require('body-parser');

var express = require('express');
var app = express();

app.use(bodyParser.json());
var server = require('http').Server(app);

app.route("/")
  .post((req, res) => {
    let some = new Some();
    pool[some.id] = some;
    res.json({
      message: "created"
    });
  })
  .delete((req, res) => {
    let id = req.body.id;
    if (id in pool) {
      var some = pool[id];
      some.stop();
      delete pool[id];
      res.json({message: "deleted"});
    } else {
      res.json({message: "cannot delete"});
    }
  });
});

app.listen(8000, () => {
  console.log('listening on *:8000');
});


где бы я и как не пытался убить this.timer - он не убивается((( я так понял что что-то не так с контекстом вызова, но попроверял и вроде все ок. что я не так делаю и куда копать???;(

UPD.: наткнулся на тостере что каким-то макаром js умеет делать "скрытые" замыкания. Может у меня как раз тот случай?
  • Вопрос задан
  • 549 просмотров
Решения вопроса 1
uakoB
@uakoB Автор вопроса
UPD.: прикрепляю ссылку на pastebin
pastebin.com/Z4WbQQP1

Решение: надо было подробнее почитать про this. В общем, таймер прикреплялся не к тому объекту к которому я думал) всем спасибо
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
"Скрытые замыкания", ЕМНИП, это страшилка времен IE6-8.

Я упростил ваш код до такого и он работает:

function Some() {
    this.id = Math.floor(Math.random() * 1000);
    this.timer = setInterval(() => {
        console.log('чем-то гажу в консоль');
    }, 1000 * 1);
    this.stop = () => {
        console.log(this); // тут видно, что контекст действительно правильный
        clearInterval(this.timer);
    };
}

const some0 = new Some();

setTimeout(() => {
    some0.stop();
}, 3000);


Замечу, однако, что в вашем коде функция Some не закрыта и включает в себя app.route и прочее, то есть вы не рассказываете всей правды и понять, что же именно не так, довольно трудно.
Еще у вас pool это массив, а используется как объект. Плюс вы используете стрелочные функции, но эмулируете класс через стремные костыли.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 11:48
10000 руб./за проект
19 апр. 2024, в 11:14
65000 руб./за проект