RxJs - условная цепочка подписки с картами и операторами вместо вложенности - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь настроить рецепт RxJs для выполнения некоторых шагов и выполнения операций условно на основе результатов некоторых подписок.

Псевдокод:

  if (trySocialSign() succeeds) {
     if (tryGetUserFromDatabase() succeeds) {
         do.some.stuff
         return
     } else {
         do.other.stuff
     }
  }

Прямо сейчас у меня есть эта уродливая функция, которая работает, но мне интересно, есть ли более красивый способ использования каналов и карт и других операторов rxjs, чтобы иметь возможность достичь того же эффекта более идиоматическим способом с меньшим количеством вложений.Может кто-нибудь, пожалуйста, помогите мне?

this.auth.getCurrentUserAsync().subscribe(
  (u: EasyAuthUser) => {
    this.currentUser = u;

    this.users.getUser().subscribe(
      (user: User) => {
        this.onExistingUserSignIn.emit(user);
      },
      (err: HttpErrorResponse) => {
        if (redirected) {
          this.onSignIn.emit(u);
        }
      }
    );
  },
  (err: HttpErrorResponse) => {this.handleHttpError(err)}
)

1 Ответ

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

Вы можете сделать это, как показано в следующем коде (я не проверял это по понятным причинам).Все побочные эффекты выполняются только от let.Также есть один catchError, который будет подавлять внутреннюю ошибку.

this.auth.getCurrentUserAsync().pipe(
  let((u: EasyAuthUser) => this.currentUser = u),
  mergeMap((u: EasyAuthUser) => this.users.getUser().pipe(
    let(
      (user: User) => this.onExistingUserSignIn.emit(user),
      (err: HttpErrorResponse) => {
        if (redirected) {
          this.onSignIn.emit(u);
        }
      }
    ),
    catchError(e => empty()), // Maybe you don't even want this `catchError`
  ))
).subscribe(
  user => ...,
  (err: HttpErrorResponse) => this.handleHttpError(err),
);
...