私はリアクティブ プログラミングにかなり慣れていませんが、すでに恋に落ちています。しかし、脳をそれに切り替えるのはまだ難しいです。「サブジェクトの使用を避ける」、「不純な関数を避ける」、そしてもちろん「命令コードを避ける」などのすべての推奨事項に従うようにしています。
私が達成するのが難しいと感じているのは、一方のモジュールが「アクション」/オブザーバブルを登録でき、もう一方のモジュールがサブスクライブしてそれに反応できる単純なクロスモジュール通信です。単純なメッセージ バスはおそらく機能しますが、これにより、回避しようとしているサブジェクトと命令型のコード スタイルの使用が強制されます。
だからここに私が遊んでいる簡単な出発点があります:
// 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");});
したがって、現在、2 番目のモジュールがサブスクライブすると、「myAction」Observable が「トリガー」されます。そして、実際のシナリオでは、ajax 呼び出しになる可能性があります。「myAction」がmodule1から適切に呼び出されるまで、すべてのサブスクライバーを遅延/待機させる方法はありますか? 繰り返しになりますが、サブジェクトを使用すると簡単に実行できますが、推奨される方法に従って実行しようとしています。