Я искал похожий вопрос, но не смог найти тот, который соответствует, поэтому извиняюсь, если это дубликат.
У меня есть несколько цепочек наблюдаемых.
Наблюдаемые вызовы А НаблюдаемыеB через switchmap.
Теперь наблюдаемая B фактически является субъектом поведения, но я не думаю, что она имеет отношение к вопросу.
Теперь наблюдаемая B никогда не завершается.Он постоянно передает либо true, либо false.
Observable B вызывает Observable C через карту переключателей, когда получает значение true.Observable C делает вещи и вызывает другие наблюдаемые через switchmap.И так далее, и так далее.
Что мне нужно сделать, так это когда наблюдаемый B получает false, он ничего не делает (в настоящее время настроен таким образом).Когда наблюдаемая B получает истину, она вызывает наблюдаемую C (в настоящее время работает).Теперь он распространяется на мою первоначальную подписку, и я рад сообщить результат моей последней наблюдаемой.
Но ...... он никогда не завершается, потому что Observable 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)
);
}