我的要求是我有两个端点,一个列出HondaCars,另一个列出PeugoetCars列表当我使用combineLatest
运算符时,它不等待另一个流完成;
这里我的要求=>第一次等待,直到两个源流都收到一个值,然后在其中一个接收到值
之后刷新修改
所以经过一段时间的搜索,我只是坚持combineLatest
,但诀窍就在这里:
this.loading = Observable.combineLatest(
myFirstObservableIndicatingIfFirstHttpReqEnded,
mySecondObservableIndicatingIfSecondHttpReqEnded
).map(d => d.some(t => t === true));
现在,用户只看到微调器,直到所有请求都已完成,即使其中一个observable已经发出某些值。
只是为了澄清我有两个loadingReducers来处理每个observable的加载逻辑,所以在我的情况下我这样做就知道两个http调用何时完成
答案 0 :(得分:2)
您需要先使用Observable.forkJoin()
,然后使用.switchMap()
将观察结果切换为Observable.combineLatest()
:
let combined = Observable
.forkJoin([myFirstObservableIndicatingIfFirstHttpReqEnded, mySecondObservableIndicatingIfSecondHttpReqEnded])
.switchMap(joinedResults => {
console.log('forkJoined results!', joinedResults);
this.hasReqEnded = joinedResults.some(t => t === true);
return Observable.combineLatest(joinedResults)
});
combined.subscribe(d => this.hasReqEnded = d.some(t => t === true));
注意 :this.hasReqEnded
只是我创建的一些虚拟变量。诀窍是你需要两次写this.hasReqEnded
的值:一次在switchMap(在forkJoin之后),另一个在订阅时,在Observable.combineLastest()
之后。
或者你可以有两个observable:一个是forkJoin
,另一个是combineLatest()
,你可以订阅两个Observable并相应地更新你的变量。
答案 1 :(得分:0)
Http调用是有限流:它发出值并完成。 所以,第一部分:"第一次等到两个源流都收到一个值"
const initial$ = Rx.Observable.forkJoin(
this.httpService1.get(),
this.httpService2.get()
);
第二部分:"在其中一个接收到值"之后刷新之后。
我们需要将一些无限流(例如某些用户操作)转换为' HondaCars'或者' PeugoetCars',它可以通过" .switchMap"来完成:
const stream1$ = someUserAction1$
.switchMap(()=>this.httpService1.get());
所以,如果我们想要一个< [HondaCars,PeugoetCars]>的流。在一些动作之后立即发出:
Rx.Observable.combineLatest(
someUserAction1$
.startWith(null) // we need to make initial call, but we have no user action yet, fix it )
.switchMap(()=>this.httpService2.get())$,
someUserAction2$
.startWith(null)
.switchMap(()=>this.httpService2.get())$
);