4

サブスクライバーが更新される順序を確実にする方法はありますか?

ホットなオブザーバブルがあり、最初のサブスクライバーは変数を更新するために同期作業を行い、次のサブスクライバーはサービスを初期化する必要があります (一度だけ!)、その変数が確実に設定された後にのみ!

次のようになります。

import App from './App'

var appSource = App.init() // gets the hot observable

// our second subscriber
appSource.take(1).subscribe(() => {
  // take 1 to only run this once
  nextService.init()
})

次のようになりApp.initます。

...
init() {
  var source = this.createObservable() // returns a hot interval observable that fetches a resource every few minutes

  // first subscriber, updates the `myVar` every few minutes
  source.subscribe((data) => this.myVar = data)

  return source
}
...

これは現在機能していますが、常に100%注文に従うかどうかはわかりません.

編集:

私が聞いたように、サブスクライバーは FIFO で呼び出されます。そのため、順序はある程度保証されています。

4

1 に答える 1

2

オブザーバーがサブスクリプションの順に呼び出されることを RxJS が明示的に保証しているかどうかはわかりません。でも、おっしゃるとおり、普通に使えます。

ただし、暗黙的なオブザーバーの順序に依存するのではなく、実際のワークフローをモデル化することを検討することもできます。

追加のアクションを実行できるように、アプリがいつ初期化されるかを知る必要があるようです。の内部動作に関する知識に頼る代わりに、App.initこのAppための API を公開できます。

1 つ (Rx 以外の方法) は、呼び出し元に次のコールバックを提供させることinitです。

//...
init(callback) {
  var source = this.createObservable() // returns a hot interval observable that fetches a resource every few minutes

  // first subscriber, updates the `myVar` every few minutes
  source.subscribe((data) => {
    this.myVar = data;
    if (callback) {
        callback();
        callback = undefined;
    }
  })

  return source
}

// elsewhere
App.init(() => nextService.init());

コールバックの代わりのもう 1 つのオプションは、初期化が完了したら解決した (または通知した) をinit返すことです。PromiseRx.AsyncSubject

さらに別のオプションは、少しリファクタリングが必要ですがthis.myVar、観察可能なデータとしてモデル化することです。すなわち:

init() {
    this.myVar = this.createObservable().replay(1);
    this.myVar.connect();
    // returns an observable that signals when we are initialized
    return this.myVar.first();
}

// elsewhere, you end up with this pattern...
const servicesToInit = [ App, service1, service2, service3 ];
Observable
    .of(servicesToInit)
    .concatMap(s => Rx.Observable.defer(() => s.init()))
    .toArray()
    .subscribe(results => {
        // all initializations complete
        // results is an array containing the value returned by each service's init observable
    });

現在、利用したいものはすべてmyVar、現在および/または将来の値を取得するために、何らかの方法でそれを購読する必要があります。現在の値を同期的に要求することはできませんでした。

于 2015-07-29T14:48:03.810 に答える