Angular, rxjs: исправление вложенных подписок с помощью flatMap - PullRequest
0 голосов
/ 06 июня 2019

Я довольно новичок в angular и rxjs ... Я написал некоторый код, который я хотел бы реорганизовать, потому что я читал, что то, что я сделал, оказалось анти-паттерном: вложенные подписки наблюдаемых.

Я обыскал все места в Интернете, чтобы найти решение (надеюсь, я что-то не упустил) и понял, что мне нужно сделать, но не может применяться к моему делу: использование flatMap должно решить проблему.Вот конкретный код:

...
observable1$: Observable<any>;
observable2$: Observable<any>;
...

constructor (...) {
...
    this.observable1$ = this.someStore.pipe(select(Selector.selectMyObs1));
    this.observable2$ = this.someStore.pipe(select(Selector.selectMyObs2));
...
}

...
this.observable1$.subscribe(val1 => {
    if (val1.error === false) {
        this.observable2$.subscribe(val2 => {
            this.someArray.push(val2);
        });
    }
});
...

Код работает каким-то образом, но я не уверен, что мне просто повезло или как.Я хотел бы знать, как переписать этот код с помощью flatMap, учитывая тот факт, что мне нужно сделать 2-ую подписку, только если 1-я не получает ошибку.

1 Ответ

1 голос
/ 06 июня 2019

Как примерно так -

this.observable1$
    .pipe(
      mergeMap(val1 => {
        if(val1.error === false) {
          return this.observable2$
                     .pipe(
                       tap(val2 => {
                          this.someArray.push(val2);
                       })
                     );
        }

        return of(null);
      })
    ).subscribe();

Это позволит избежать множественной подписки.Здесь мы составляем наблюдаемое.

...