0

私はリアクティブ プログラミングにかなり慣れていませんが、すでに恋に落ちています。しかし、脳をそれに切り替えるのはまだ難しいです。「サブジェクトの使用を避ける」、「不純な関数を避ける」、そしてもちろん「命令コードを避ける」などのすべての推奨事項に従うようにしています。

私が達成するのが難しいと感じているのは、一方のモジュールが「アクション」/オブザーバブルを登録でき、もう一方のモジュールがサブスクライブしてそれに反応できる単純なクロスモジュール通信です。単純なメッセージ バスはおそらく機能しますが、これにより、回避しようとしているサブジェクトと命令型のコード スタイルの使用が強制されます。

だからここに私が遊んでいる簡単な出発点があります:

    // 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から適切に呼び出されるまで、すべてのサブスクライバーを遅延/待機させる方法はありますか? 繰り返しになりますが、サブジェクトを使用すると簡単に実行できますが、推奨される方法に従って実行しようとしています。

4

2 に答える 2