Возможно ли использование паттерна в моем случае?

Имеется socket.io server и класс Random

class Random {
    constructor(timer) {
        this.timer = timer
        this.status = 0
    }
    async setStatus() {
        const interval = setInterval(()=> {
            this.timer -= 1
            if(this.timer <= 0) {
                this.status = 1
            }
        }, 1000)
    }

}

Код Socket.io server

const Random = require('../Random').Random
const chanels = {}
const timers = [{timer: 20, name: "chanel1"},{timer: 400, "chanel2"}]
timers.map((timer,id) => chanels[timer.name] = new Random(timer.time))

socket.on('startTimer', async (name, callback) => {
    await chanels[name].setStatus()
})

Проблема:

Я хочу выполнять определенное событие на socket-сервере в том случае, если this.status = 1. Т.е мне нужно отслеживать смену this.status и оповещать об этом socket часть

Вопрос:

Каким образом это можно реализовать? Пытался сделать через setInterval на стороне сокета запрашивая каждую секунду this.state, но на мой взгляд это крайне плохое решение. Наткнулся на паттерн observer, но возможна ли его реализация в моем случае?


Ответы (1 шт):

Автор решения: nörbörnën

Random.js

class Random {
  constructor(timer) {
    this.timer = timer
    this.status = 0
  }
  async setStatus() {
    return new Promise((resolve) => {
      if (status === 1) {
        resolve(this);
      }
      setTimeout(
        () => {
          this.status = 1;
          resolve(this);
        },
        this.timer * 1000
      );
    });
  }
}

module.exports = { Random };

обработчик socket-событий:

const Random = require('../Random').Random

const channelSettings = [
  { delay: 20, name: "channel1" },
  { delay: 400, name: "channel2" },
];

const channels = channelSettings.reduce((acc, {delay, name}) => {
  acc[name] = new Random(delay);
  return acc;
}, {});

socket.on('startTimer', async (name, callback) => {
  if (name in channels) {
    await channels[name].setStatus();
    //
    // do something here...
    //
  }
});
→ Ссылка