2017-11-06 11 views
0
resource1$ = hash1$.map((renew: boolean) => renew ? http1$ : Observable.empty()); 
resource2$ = hash2$.map((renew: boolean) => renew ? http2$ : Observable.empty()); 

sync$ = Observable.forkJoin(resource1$, resource2$); 

sync$.subscribe(() => console.log('Sync done!), (err) => console.log('Sync failed!')); 

こんにちは、 私のアプリケーションが起動したとき、私はAPIから同期する複数のリソースを持っています。 私はそれらを並行して同期させ、HEAD要求を使用してそれらを同期させ、X-HASHヘッダを古いものと比較する必要があるかどうかをチェックしたい。条件RxJSストリーム

ですから、hash1 $はHEADリクエストを行い、ハッシュを比較してtrueまたはfalseを返します。

resource1 $がObservable.emptyを返すと、$がすべてのストリームをキャンセルするため、私は立ち往生しています...そして、理由はわかりません。

答えて

1

forkJoinには、すべてのソースオブザーバブルが少なくとも1つのアイテムを放出して完了する必要があります。 Observable.empty()を使用している場合は、complete通知のみを送信するので、forkJoinは送信しません。あなたは、たとえば行うことができます

resource1$ = hash1$.map((renew: boolean) => renew ? http1$ : Observable.of(false)); 
resource2$ = hash2$.map((renew: boolean) => renew ? http2$ : Observable.of(false)); 

sync$ = Observable.forkJoin(resource1$, resource2$) 
    .filter(results => results[0] && results[1]); // Or whatever condition you want 
+0

おかげマーティン。今は失敗しません。しかし、私は.mapの代わりに.flatMap演算子を使用する必要がありました 'hash1 $ .flatMap((更新:ブール値)=>更新?http:// Observable.of(false));) http1 $ Observable.fromPromiseですか? – David

+0

これは 'sync $'を後でどのように使いたいかによって決まります。 – martin

関連する問題