Задать вопрос

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

товарищи, бьюсь несколько дней, гуглю, ищу, но нифига не понимаю почему у меня не убивается таймер
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 умеет делать "скрытые" замыкания. Может у меня как раз тот случай?
  • Вопрос задан
  • 559 просмотров
Подписаться 2 Оценить 1 комментарий
Решения вопроса 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 это массив, а используется как объект. Плюс вы используете стрелочные функции, но эмулируете класс через стремные костыли.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
28 дек. 2024, в 15:35
500 руб./за проект
28 дек. 2024, в 15:31
750 руб./в час
28 дек. 2024, в 15:27
10000 руб./за проект