저는 Angular2 응용 프로그램을 구축하고 논리적으로 하나의 가입으로 결합하려는 두 개의 BehaviourSubjects
을 가지고 있습니다. 나는 두 가지 HTTP 요청을하고 있는데 둘 다 돌아올 때 이벤트를 시작하려고합니다. 나는 forkJoin
대 combineLatest
을보고있다. behaviourSubjects가 업데이트되고 모든 behavoirSubjects가 업데이트 된 후에 만 forkJoin이 시작되면 combineLatest가 시작되는 것 같습니다. 이 올바른지? 거기에 일반적으로 받아 들여지는 패턴이 있어야합니다.여러 rxjs BehaviourSubjects를 결합하는 방법
this._cpmService.cpmSubject.subscribe(cpmList => {
doSomeWork();
});
하지만 그 대신 : 여기
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);
}
})
});
}
}
내 구성 요소의 가입의 조각입니다 : 여기에 편집
내 angular2 구성 요소에 가입되어 내 behaviorSubjects 중 하나의 예입니다 단일 구독에 대해 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"과 함께 다운 캐스트가있는 getter를 사용하십시오. 따라서 서비스 외부에서 다음 전화를 사용할 수 없습니다 -> 관심사 분리 –