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

Как применить паттерн observer правильно?

Здравствуйте. Столкнулся с проблемой при использовании паттерна observer. Ситуация такая: мне приходит от пользователя сообщение, и мне надо сделать следующее:
1) Получить часовой пояс с помощью экземпляра класса googleMapsAPI
const zone = await geoTime.getTimeZone(msg.text)
2) Получить все раннее записанные данные в Redis
const user = await redisApi.getUserForSave(msg.from.id)

3) Записать это всё в MySQL. И в зависимости от кода ответа и наличия ошибки ответить пользователю
const code = await sql.saveUser(user);
code === 'good' ? bot.sendMessage(msg.from.id, 'Good') : bot.sendMessage(msg.from.id, 'Good');


В итоге код получается громоздкий. И нарушается связность между модулями:
observer.on('end', (msg) => {
   const zone = await geoTime.getTimeZone(msg.text);
   const user = await redisApi.getUserForSave(msg.from.id);
   const code = await sql.saveUser(user);
   code === 'good' ? bot.sendMessage(msg.from.id, 'Good') : bot.sendMessage(msg.from.id, 'Good');
})


Это я немного упростил код и логику. В реальной жизни всё чуть сложнее. Как правильно быть в такой ситуации?
  • Вопрос задан
  • 467 просмотров
Подписаться 3 Оценить 3 комментария
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Поскольку обработчик сообщения получается громоздким, его можно легко вынести в отдельный модуль и импортировать примерно так.

const messageProcessor = require('path/to/message/processor');
// ваш код идет здесь ...
// далее навешиваем наш обработчик на шину сообщений
messageBus.on('end', messageProcessor);


Так же вы можете автоматическую регистрацию внутри обработчика.
// в вашем основном файле
messageProcessor.register(messageBus);


Внутри процессора сообщений
function messageProcessor() {
 // ...
}

module.exports.register = function(messageBus) {
   messageBus.on('end', messageProcessor);
};
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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