rxjs условные вложенные наблюдаемые - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть следующий код, который работает как задумано:

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.Идентификатор установлен.

Что я делаю не так?

1 Ответ

0 голосов
/ 19 ноября 2018

следующее - самый чистый способ справиться с этим (по моему мнению):

source.pipe(
  tap(val => doAnyway(val)),
  switchMap(val => val.id ? of(val.id) : this.idService.getDefault())
).subscribe(id => {
  this.id = id;
  doSomething(id);
});

Вы можете видеть, насколько это коротко и ясно, и это делает то же самое, что и ваш первый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...