【问题标题】:RxJs - conditional subscription chain with maps and operators instead of nestingRxJs - 使用地图和运算符而不是嵌套的条件订阅链
【发布时间】:2018-11-29 02:45:15
【问题描述】:

我正在尝试设置一个 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)}
)

【问题讨论】:

    标签: rxjs observable angular6


    【解决方案1】:

    你可以像下面的代码那样做(我没有测试它,原因很明显)。所有副作用仅从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),
    );
    

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多