Возможно ли использование паттерна в моем случае?
Имеется 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...
//
}
});