Задать вопрос
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, но возможна ли его реализация в моем случае?
  • Вопрос задан
  • 101 просмотр
Подписаться 1 Средний 2 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Бэкенд на Node.js для фронтенд-разработчиков
    3 месяца
    Далее
  • Skillbox
    Node.js
    2 месяца
    Далее
  • Stepik
    Microservices - паттерны и практика построения микросервисов
    1 неделя
    Далее
Пригласить эксперта
Ответы на вопрос 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');
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы