2017-02-04 17 views
1

プロビジョニングをサブスクリプションに変換するために使用しているObservableがあります。この結果、各要素でHTTPサービスを呼び出すために反復処理を行う必要があります。私はforkJoinを使用して、これらの呼び出しが完了するのを待ってから何かできるようにしていますが、申し訳ありませんが、私のサブスクリプションは呼び出されていません。私はここに何が欠けているのか見ていますか?観測可能なサブスクリプションが呼び出されない

答えて

2

forkJoin()に引き渡されたObservableには、いずれも購読していません。オペレータはそれ自体を行う必要があります。

Observableが完了するたびに通知を受けたい場合は、.do(undefined, undefined,() => {...})を使用できます。

let observables = [ 
    Observable.of(42).do(undefined, undefined,() => console.log('done')), 
    Observable.of('a').delay(100).do(undefined, undefined,() => console.log('done')), 
    Observable.of(true).do(undefined, undefined,() => console.log('done')), 
]; 

Observable.forkJoin(observables) 
    .subscribe(results => console.log(results)); 

これは、コンソールに出力します。

done 
done 
done 
[ 42, 'a', true ] 

は、最終的に.finally()オペレータもあります。ただし、.do()を使用するのと同じではありません。

EDIT:

ソース観測のいずれかforkJoin()オペレータが(それはまた失敗手段)エラーを再放出失敗。
これは、別々に観測可能な各ソース(例:catch()演算子)でエラーを捕捉する必要があることを意味します。印刷し

let observables = [ 
    Observable.throw(new Error()) 
    .catch(() => Observable.of('caught error 1')) 
    .do(undefined, undefined,() => console.log('done 1')), 

    Observable.of('a') 
    .delay(100).catch(() => Observable.of('caught error 2')) 
    .do(undefined, undefined,() => console.log('done 2')), 

    Observable.of(true) 
    .catch(() => Observable.of('caught error 3')) 
    .do(undefined, undefined,() => console.log('done 3')), 
]; 

Observable.forkJoin(observables) 
    .subscribe(results => console.log(results)); 

:私は、それぞれが完了すると(UIのプログレスバーの)私のカウンタをインクリメントする方法

done 1 
done 3 
done 2 
[ 'caught error 1', 'a', true ] 
+0

あなたが何を意味しているかは分かりますが、それらのオブザーバブルのうちの1つに例外がある場合、他のオブザーバブルが完了する前にforkJoinがすぐにそれをピックアップしています。私はforkJoinがすべて完了するのを待っていたと思っていましたが、ソースから次のものに行くのではなく「完了」とマークするように見えます。私の例では、それぞれの観測者がエラーを正常に処理し続けることを望みます。それを行う方法はありますか? – occasl

+0

@occasl更新情報を参照してください。 – martin

0

私はマップに登録する必要はありません。ここrxjs例であること

Observable.fromPromise(this.users.getElements()).subscribe(results => { 
    Observable.forkJoin(
    results.map(
     aUser => this.HttpService.submitUser(aUser)) 
    ).subscribe(
     //it never gets to either of these calls after all service calls complete 
     data => { 
     debugger; 
     console.log(data); 
     this.reset(); 
     }, 
     err => { 
     debugger; 
     console.log(err); 
     this.reset(); 
     } 
    )); 
}); 

注:

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

彼らは個々の観測に加入していない - ForkJoinは行くそれらをすべて取得しますが、その後、(返すためにそれらのすべてを待ち。あなた購読中)

EDIT:

forkjoin源はここにある:

https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/forkjoin.js

それぞれが終了するタイミングを知るためのフックがないように見えます。私は、UIバーに近づける最善の方法は、マッピングされたオブザーバブルのそれぞれを個別に購読して、UIカウントバー変数をインクリメントする関数を呼び出し、データを使用できるようにする「完全性」のテストを行うことだと思います。

+0

うん、しかし、その後?基本的に私は、それぞれが完了すると何かをしたい、そしてすべてが完了したら何かをしたい。 – occasl

+0

私はちょうどforkjoinのソースを調べましたが、私はそれがあなたがフックしてそれぞれが来る時を見ることを可能にするものを公開していないと思う。私はあなたがそれらのマップのそれぞれを個別に購読し、あなたのUIプログレスバーのカウント機能。 – chrispy

関連する問題