プロビジョニングをサブスクリプションに変換するために使用しているObservableがあります。この結果、各要素でHTTPサービスを呼び出すために反復処理を行う必要があります。私はforkJoinを使用して、これらの呼び出しが完了するのを待ってから何かできるようにしていますが、申し訳ありませんが、私のサブスクリプションは呼び出されていません。私はここに何が欠けているのか見ていますか?観測可能なサブスクリプションが呼び出されない
答えて
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 ]
私はマップに登録する必要はありません。ここ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カウントバー変数をインクリメントする関数を呼び出し、データを使用できるようにする「完全性」のテストを行うことだと思います。
- 1. 複数回呼び出される観測可能なサブスクリプションですか?
- 2. 角2の観測可能なサブスクリプションがトリガーされない
- 3. 観測可能なサブスクリプションを別の観測可能なサブスクリプションにネストすることは可能ですか?
- 4. Rxjs観測可能なサブスクリプションの数
- 5. 角度2 httpが2回呼び出されて観測可能になる
- 6. 観測可能なサブスクライブメソッドが一度だけ呼び出される
- 7. Rxjs観測可能なサブスクリプションが決して正確に公開されない
- 8. 観測可能/サブスクリプションがリフレッシュされたときのUIブロッキング
- 9. 観測可能なサブスクリプションを待っていますAngelar2
- 10. Angualr Rxjs観測可能なアイテム数はサブスクリプションで倍になる
- 11. 観測可能な配列内のノックアウト観測可能なオブジェクト
- 12. 観測可能なデータを観測可能な配列にプッシュノックアウト
- 13. rxjs観測可能な.mapが実行されていない
- 14. データが返されたときに観測可能なサブスクリプションが実行されない
- 15. RxJS:同じルートを使用していない観測可能な観測値観測可能な値
- 16. 観測可能なサブスクリプション - 次のメソッドを無視する
- 17. 観測可能なサブスクリプションで関数を実行
- 18. 観測可能なデータはサブスクリプションで利用できません
- 19. 角度2観測可能なサブスクリプションのパラメータとサービスのエラー
- 20. 観測およびサブスクリプション
- 21. Ngが観測可能ではない
- 22. KnockoutJS - 観測可能なオブジェクトの観測可能配列
- 23. UIが観測可能な配列を検出しない
- 24. Rxjs - 約束を呼び出し、順番に観測可能
- 25. Typescript - 私がキャッチを呼び出すと観測可能な応答のタイプが変更される
- 26. なぜ熱い観測可能なresubscribe
- 27. angular2の同じクラスで観測可能な関数を呼び出す
- 28. RxJava:観測可能な呼び出しをonCompleteに偽装しました
- 29. 観測可能なサービスを呼び出すコンポーネントをユニットテストする方法
- 30. rxjavaチェーンから観測不可能なコードを呼び出す方法
あなたが何を意味しているかは分かりますが、それらのオブザーバブルのうちの1つに例外がある場合、他のオブザーバブルが完了する前にforkJoinがすぐにそれをピックアップしています。私はforkJoinがすべて完了するのを待っていたと思っていましたが、ソースから次のものに行くのではなく「完了」とマークするように見えます。私の例では、それぞれの観測者がエラーを正常に処理し続けることを望みます。それを行う方法はありますか? – occasl
@occasl更新情報を参照してください。 – martin