Я довольно новичок в области реактивного программирования, но уже влюблен. Однако мне все еще сложно переключить мой мозг. Я стараюсь следовать всем рекомендациям как «Избегайте использования предметов» и «Избегайте нечистых функций» и, конечно, «Избегайте императивного кода».RxJS/ReactiveX Соответствующие модули связи
То, что мне трудно достичь, - это просто перекрестные коммуникации модулей, где один модуль может регистрировать «действие»/наблюдаемый, а другой может подписаться и реагировать на него. Простая шина сообщений, вероятно, будет работать, но это обеспечит использование объектов и стиля императивного кода, которые я пытаюсь избежать.
Так вот простой отправной точкой я играю с:
// 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");});
Так в настоящее время в данный момент второй модуль при подписке он «запускает» в «MyAction» Наблюдаемый. И в сценарии реальной жизни, который может быть ajax-вызовом. Есть ли способ заставить всех подписчиков задерживать/ждать, пока «myAction» не будет вызван должным образом из модуля 1? И снова - его легко сделать, используя темы, но я пытаюсь сделать это, следуя рекомендациям.
Что вы подразумеваете под * «myAction», называется надлежащим образом из модуля1 *? Вы имеете в виду, пока это не закончится или что? – martin
Да. полный будет работать –