Senbonzakuraa
@Senbonzakuraa
Начинаю начинать

Можно ли использовать паттерн или как лучше решить задачу?

Имеется 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, но возможна ли его реализация в моем случае?
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Azperin
Дилетант
Мб чем поможет
function Timer(t, ch) {
	this.time = t;
	this.channel = ch;
	
	this.interval = setInterval(() => {
		if (--this.time < 1) {
			clearInterval(this.interval);
			// здесь можно делать ченить с сокетом, он же полюбому глобальный
			// либо сделать свои ивенты через эммитер
			socket.to(this.channel).emit('TIMEOUT - STATUS ZERO');
		};
	}, 1000);
	
	this.getTimeleft = () => this.time;
	
	socket.to(this.channel).emit(`TIMER STARTS, YOU HAVE - ${this.time} SECONDS TO DO SOMETHING`);
};

var timer = new Timer(10, 'chanel2');
var timer2 = new Timer(3, 'chanel5');
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы