私はAngular2アプリを構築しています。論理的に1つのサブスクリプションに結合する2つのBehaviourSubjects
があります。私は2つのHTTP要求を出していて、両方が復帰したときにイベントを発生させたい。私はforkJoin
対combineLatest
を見ています。どちらかのbehvaviorSubjectsが更新されたときにcombineLatestが起動するように見えますが、forkJoinはすべてのbehavoirSubjectsが更新された後にのみ起動します。これは正しいです?これには一般的に受け入れられているパターンがありますか?ここで複数のrxjsを組み合わせる方法BehaviourSubjects
EDIT
は私のangular2コンポーネントがに加入している私のbehaviorSubjectsの1の例である:ここで
export class CpmService {
public cpmSubject: BehaviorSubject<Cpm[]>;
constructor(private _http: Http) {
this.cpmSubject = new BehaviorSubject<Cpm[]>(new Array<Cpm>());
}
getCpm(id: number): void {
let params: URLSearchParams = new URLSearchParams();
params.set('Id', id.toString());
this._http.get('a/Url/Here', { search: params })
.map(response => <Cpm>response.json())
.subscribe(_cpm => {
this.cpmSubject.subscribe(cpmList => {
//double check we dont already have the cpm in the observable, if we dont have it, push it and call next to propigate new cpmlist everywheres
if (! (cpmList.filter((cpm: Cpm) => cpm.id === _cpm.id).length > 0)) {
cpmList.push(_cpm);
this.cpmSubject.next(cpmList);
}
})
});
}
}
私のコンポーネントのサブスクリプションの抜粋です:
this._cpmService.cpmSubject.subscribe(cpmList => {
doSomeWork();
});
しかし、その代わりに単一サブスクリプションでdoSomeWork()を起動するcpmSubjectとfooSubjectが起動したときにdoSomeWork()を起動するだけです。 http://reactivex.io/documentation/operators/zip.htmlが
zip
とcombineLatest
の違いは次のとおりです:
HTTPリクエストは、直接 'BehaviorSubject'戻ることはできません - あなたは、HTTPレスポンスnexting'' 'BehaviorSubject'にそれぞれ、あるいは多分であることを、私は仮定しているが'Subject'を' get/post/put'に登録しますか? – olsn
@olsnはい、私はhttpレスポンスを購読しています。サービスクラスのレスポンスで自分のサブジェクトをネックス化しています – cobolstinks
ビヘイビアサブジェクトへのパブリックアクセスは反パターンです。代わりに、 "as Observable"のダウンキャストを持つゲッターを使用してください。だから、あなたはサービスの外に次の呼び出しを使用することはできません - >懸念の分離 –