rxjs触发并行请求并等待完成并在其中一个发出后更新

时间:2017-08-30 09:46:21

标签: redux rxjs rxjs5

我的要求是我有两个端点,一个列出HondaCars,另一个列出PeugoetCars列表当我使用combineLatest运算符时,它不等待另一个流完成;

这里我的要求=>第一次等待,直到两个源流都收到一个值,然后在其中一个接收到值

之后刷新

修改

所以经过一段时间的搜索,我只是坚持combineLatest,但诀窍就在这里:

this.loading = Observable.combineLatest(
  myFirstObservableIndicatingIfFirstHttpReqEnded,
  mySecondObservableIndicatingIfSecondHttpReqEnded
).map(d => d.some(t => t === true));

现在,用户只看到微调器,直到所有请求都已完成,即使其中一个observable已经发出某些值。

只是为了澄清我有两个loadingReducers来处理每个observable的加载逻辑,所以在我的情况下我这样做就知道两个http调用何时完成

2 个答案:

答案 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并相应地更新你的变量。

这是working JSBin

答案 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())$
);