Redux rxjs发出并行请求,并等待其中一个请求发出后完成和更新
我的要求是,当我使用Redux rxjs发出并行请求,并等待其中一个请求发出后完成和更新,redux,rxjs,rxjs5,Redux,Rxjs,Rxjs5,我的要求是,当我使用CombineTest操作符时,我有两个端点,一个端点到HondaCars列表,另一个端点到PeugoetCars列表,它不会等待另一个流完成 在这里,我的需求=>第一次等待,直到两个源流都收到一个值,然后在这之后,在两个源流中的一个都收到一个值之后刷新 编辑 因此,经过一段时间的搜索,我坚持使用combinelatetest,但诀窍在于: this.loading = Observable.combineLatest( myFirstObservableIndicati
CombineTest
操作符时,我有两个端点,一个端点到HondaCars列表,另一个端点到PeugoetCars列表,它不会等待另一个流完成
在这里,我的需求=>第一次等待,直到两个源流都收到一个值,然后在这之后,在两个源流中的一个都收到一个值之后刷新
编辑
因此,经过一段时间的搜索,我坚持使用combinelatetest
,但诀窍在于:
this.loading = Observable.combineLatest(
myFirstObservableIndicatingIfFirstHttpReqEnded,
mySecondObservableIndicatingIfSecondHttpReqEnded
).map(d => d.some(t => t === true));
所以现在,用户只看到微调器,直到所有请求都完成,即使两个观察值中的一个已经发出了一些值
为了澄清,我有两个LoadingReducer来处理每个observable的加载逻辑,因此在我的例子中,我这样做是为了知道两个http调用何时完成,您需要首先使用
observable.forkJoin()
,然后使用.switchMap()
将observable切换到observable.CombineTest()
:
注意:这个.hasreqend
只是我创建的一些伪变量。诀窍是您需要将this.hasreqend的值写入两次:一次在switchMap(forkJoin之后),另一次在subscribe(subscribe),它位于可观察的.combineLastest()之后
或者,您可以有两个观察值:一个是forkJoin
,另一个是combineLatest()
,您可以订阅这两个观察值并相应地更新变量
这里有一个Http调用是有限流:它发出值并完成。 第一部分:“第一次等待,直到两个源流都收到一个值” 第二部分:“在两者之一收到值后刷新” 我们需要将一些无限流(例如一些用户操作)转换为“HondaCars”或“PeugoetCars”流,可以通过“.switchMap”: 因此,如果我们想在某个动作后立即发出一个流:
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())$
);
Complete对可观察事物有非常具体的含义。大理石图会让你的情况更清楚。无论如何,听起来你想要的实际上是
combineLatest
:“为了确保输出数组始终具有相同的长度,combinelateest
将实际等待所有输入观测值发出至少一次”你能用你已经尝试过的更新你的问题吗?@Jota.Toledo好的,我会用我所做的更新我的问题
const initial$ = Rx.Observable.forkJoin(
this.httpService1.get(),
this.httpService2.get()
);
const stream1$ = someUserAction1$
.switchMap(()=>this.httpService1.get());
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())$
);