我已经搜索了一个类似的问题,但是找不到匹配的问题,如果这是重复的,我深表歉意。
我有几个链状的观测值。
Observable A通过switchmap调用Observable B。
现在可观察到的B实际上是一个行为主体,但我认为与该问题无关。
现在可观察到的B永远不会完成。它会不断传递对或错。
Observable B收到值为true时,将通过切换映射调用ObservableC。 可观察的C执行操作并通过switchmap调用其他可观察的对象。依此类推。
我需要做的是,当可观察的B接收到false时,它什么也不做(当前以这种方式设置)。当可观察的B接收到true时,它将调用可观察的C(当前有效)。现在它传播到我的原始订阅,我很乐意接受最后一个可观察到的结果。
但是......它永远不会完成,因为可观察的B永远不会完成。如何使可观察的B完整或取消订阅,而在链发生之后又不停止它呢?因此,当Observable B再次获得.next(true)时,它将再次触发链,而不是我想要的。
我尝试使用takeUntil
,它传递了一个可观察到的对象,该对象在收到true时便会触发。 takeUntil的问题是所有内容都立即完成,并且我的订阅从未收到任何值(可观察到的C,并且永不触发)。
这是一些已删除逻辑的代码。
private initMap(): Observable<boolean> {
return this.platformHelperService.getUserLocation().pipe(
switchMap(_ => {
return this.updateMapCenterLocation();
public updateMapCenterLocation(): Observable<boolean> {
let mapCenterSetObserver: Observer<void>;
const mapCenterSetObsersable = Observable.create(
(observer: Observer<void>) => {
mapCenterSetObserver = observer;
}
);
// This is observable B
return this.mapAssignedBehaviorSubject.pipe(
switchMap(assigned => {
if (assigned) {
// Observable C below. Later my subscription does more after this completes
return this.platformHelperService.getUserLocation()
// If I run below my initial subscription finishes right away and C never runs.
// If I don't run this, subscription B never completes.
mapCenterSetObserver.next(undefined);
mapCenterSetObserver.complete();
}
}),
takeUntil(mapCenterSetObsersable)
);
}
答案 0 :(得分:1)
在可观察到的B中让一次真实通过可能会起作用。
....
ObservableA.pipe(
switchMap(()=>observableB.pipe(filter(res=>res),take(1))
switchMap(()=>ObservableC())
)