【问题标题】:Can we use async/await with RxJS Pattern?我们可以在 RxJS 模式中使用 async/await 吗?
【发布时间】:2018-04-01 14:07:04
【问题描述】:

我有以下场景。

如果用户输入的路线只有/lobby 而没有?competitionId= 我必须在状态上搜索用户最喜欢的比赛。收到用户最喜欢的比赛后,我必须将用户重定向到/lobby?competitionId=XYZ

我正在使用以下代码。是更好的实施方式吗?这对我来说就像一个回调地狱。我正在使用 NGRX。

RxJS 流可观察方式

redirectToCompetition(): void {
this._store.pipe(select(routerSelectors.getState)).subscribe(routerState => {
  if (!routerState.queryParams.competitionId) {
    this._store
      .pipe(select(authenticatedUserSelectors.getFavoriteCompetition))
      .subscribe(favoriteCompetition => {
        this._store.dispatch(
          new routerActions.NavigateTo({
            path: ['/lobby'],
            query: { competitionId: favoriteCompetition.id }
          })
        );
      });
  }
});
}

我使用 async/await 重写了代码。它看起来更好。

承诺异步/等待方式

async redirectToCompetitionPromise() {
    const routerState = await this._store
      .pipe(select(routerSelectors.getState))
      .first()
      .toPromise();

    const userFavoriteCompetition = await this._store
      .pipe(select(authenticatedUserSelectors.getFavoriteCompetition))
      .first()
      .toPromise();

    if (!routerState.queryParams.competitionId) {
      this._store.dispatch(
        new routerActions.NavigateTo({
          path: ['/lobby'],
          query: { competitionId: userFavoriteCompetition.id }
        })
      );
    }
  }

使用带有异步/等待模式的 RxJS 有什么问题吗?或者在我的第一个代码中我的实现很糟糕?

【问题讨论】:

    标签: angular asynchronous rxjs reactive-programming ngrx


    【解决方案1】:

    用 rxjs 使用 async/await 和 promise 没有错,只要使用得当,rxjs 本身已经可以很好地处理它

    this._store
    .pipe(select(routerSelectors.getState))
    .first()
    .filter(routerState =>routerState.queryParams.competitionId)
    .switchMap(()=>this._store.pipe(select(authenticatedUserSelectors.getFavoriteCompetition)))
    .do(favoriteCompetition =>
            this._store.dispatch(
              new routerActions.NavigateTo({
                path: ['/lobby'],
                query: { 
                competitionId: favoriteCompetition.id }
              })
            );
          ).subscribe()
      

    【讨论】:

    • 感谢您的回答。我们不能把first()filter()switchMap() 放在pipe( ... ) 里面?
    • 只是我个人的喜好,我自己不喜欢管太多。我没有看到它节省了很多打字
    • 太棒了。只有一件事是错误的,您的实现基于我的用例。我编辑了您的答案以修复以将您的答案标记为正确。谢谢!
    猜你喜欢
    • 2020-03-22
    • 2019-06-09
    • 1970-01-01
    • 2016-02-24
    • 2012-06-18
    • 2016-07-21
    • 1970-01-01
    • 2020-06-11
    • 2018-08-18
    相关资源
    最近更新 更多