У меня есть следующий код, который работает как задумано:
const sourceObservable = ... // irrelevant
sourceObservable.subscribe(x => {
doAnyway(x);
if (x.Id) {
doSometing(x);
} else {
// id Not set, get default Id
this.idService.getDefault().subscribe(id => {
x.Id = id;
doSometing(x);
});
}
});
Согласно этой статье вложенных подписок следует избегать.Вот почему я попытался изменить код выше, используя каналы.Я попытался реализовать операцию if-else с этим методом , где фильтрация используется для создания наблюдаемой ветви для каждой опции.И в конце они должны быть объединены для подписки.
const obsShared = sourceObservable.pipe(
tap(x => {
doAnyway(x);
}),
share());
const obsIdNotSet = obsShared.pipe(
filter(x => !x.kennzahlId),
merge(x => idService.getDefault().subscribe(id => {
x.Id = id;
// doSomething(x) will nomore be executed here
})));
// even though the true-part is empty I seem to need this to mergeing both options
const obsIdSet = obsShared.pipe(
filter(x => !!x.Id),
tap(() => {
// doSomething(x) will nomore be executed here
}));
obsIdSet.pipe(merge(obsIdNotSet)).subscribe(x => {
// in case obsIdNotSet this will run with x.Id not set because x.Id will be set later
doSometing(x);
});
Этот код компилируется и выполняется без ошибок, только он выполняет doSomething(x)
перед вызовом idService.getDefault().....
и, хотя он будет вызываться без x.Идентификатор установлен.
Что я делаю не так?