Я новичок в реактивном программировании, но уже влюблен. Однако все еще трудно переключить мой мозг на это. Я стараюсь следовать всем рекомендациям, таким как «Избегайте использования тем» и «Избегайте нечистых функций» и, конечно же, «Избегайте императивного кода».
Чего мне трудно достичь, так это простой связи между модулями, когда один модуль может регистрировать «действие»/наблюдаемое, а другой может подписываться и реагировать на него. Простая шина сообщений, вероятно, будет работать, но это заставит использовать субъекты и императивный стиль кода, которого я пытаюсь избежать.
Итак, вот простая отправная точка, с которой я играю:
// some sandbox
class Api {
constructor() {
this.actions = {};
}
registerAction(actionName, action) {
// I guess this part will have to be changed
this.actions[actionName] = action.publishReplay(10).refCount();
//this.actions[actionName].connect();
}
getAction(actionName) {
return this.actions[actionName];
}
}
const api = new Api();
// -------------------------------------------------------------------
// module 1
let myAction = Rx.Observable.create((obs) => {
console.log("EXECUTING");
obs.next("42 " + Date.now());
obs.complete();
});
api.registerAction("myAction", myAction);
let myTrigger = Rx.Observable.interval(1000).take(2);
let executedAction = myTrigger
.flatMap(x => api.getAction("myAction"))
.subscribe(
(x) => { console.log(`executed action: ${x}`); },
(e) => {},
() => { console.log("completed");});
// -------------------------------------------------------------------
// module 2
api.getAction("myAction")
.subscribe(
(x) => { console.log(`SECOND executed action: ${x}`); },
(e) => {},
() => { console.log("SECOND completed");});
Итак, в настоящее время, когда второй модуль подписывается, он «запускает» Observable «myAction». И в реальном сценарии это может быть вызов ajax. Есть ли способ заставить всех подписчиков задержать/ждать, пока «myAction» не будет правильно вызван из модуля 1? И снова - это легко сделать с помощью предметов, но я пытаюсь сделать это, следуя рекомендуемым практикам.