Существует общий подход к использованию промежуточного программного обеспечения во многих средах.
In ExpressJS - здесь я обрабатываю запрос с middleware-chain
:
app.use('/url', middleware1);
app.use('/url', middleware2);
app.use('/url', middleware3);
In Telegraf - здесь я обрабатываю событие сообщения (как бот) с помощью middleware-chain
:
bot.on('text', middleware1);
bot.on('text', middleware2);
bot.on('text', middleware3);
Выше приведены примеры работы, которые я хочу реализовать, чтобы отложить некоторые запросы / события. В этом случае, если мой middleware-chain
в данный момент занят обработкой какого-либо запроса / события - я могу сохранить новые входящие события / запросы в БД и обработать их позже, когда мой middleware-chain
будет свободен. Основной причиной этого является ограничение для некоторых пользователей отправлять только один запрос / событие за раз и ждать ответа, если middleware-chain
занят.
Давайте предположим, что я могу хранить / извлекать все, что мне нужно, в / из БД. Однако, если я получил какой-либо запрос / событие из БД - я хочу отправить / передать этот запрос / событие через все мои промежуточные программы. В этом случае мне нужно переопределить всплывающее событие, если фреймворк не поддерживает это.
Однако я могу использовать Observable для этого.
ExpressJS:
const sbj = new Subject();
app.use('/url', (...args) => {
sbj.next(args)
});
observable.subscribe({
next: middleware1
});
observable.subscribe({
next: middleware2
});
observable.subscribe({
next: middleware3
});
Telegraf:
const sbj = new Subject();
bot.on('text', (...args) => {
sbj.next(args)
});
observable.subscribe({
next: middleware1
});
observable.subscribe({
next: middleware2
});
observable.subscribe({
next: middleware3
});
Но мне не хватает одной важной функции в Observable-chain
, которую я имею в middleware-chain
=> в middleware-chain
Я могу отменить следующее промежуточное ПО. Например. middleware1 -> next -> middleware2 -> cancel
.
Как я могу добиться того же поведения с Observable
(чтобы одна подписка могла отменить другую)? Я думаю, что для этого должно быть элегантное решение.