【问题标题】:Returning an Observable from a Promise that returns an Observable从返回 Observable 的 Promise 返回 Observable
【发布时间】:2018-04-19 19:15:03
【问题描述】:

我有以下功能:

public isAuthenticated(): Observable < boolean > {
  return fromPromise(this.renewTokens()
    .then(() => {
      return this.fetchUserData().pipe(map(user => {
        // store the user object somewhere
        return user !== null;
      }));
    })
    .catch(error => {
      this.ctx.log.error('Token renewal error', error);
      return false;
    }));
}

我首先尝试更新用户令牌(函数renewTokens() 返回Promise),然后使用返回Observable&lt;User&gt;fetchUserData() 函数获取用户配置文件。我想将此用户配置文件存储在某处,然后返回Observable&lt;boolean&gt;,如图所示。

当然以上返回error TS2322: Type 'Promise&lt;boolean | Observable&lt;boolean&gt;&gt;' is not assignable to type 'Observable&lt;boolean&gt;'. 我完全理解但不知道如何解决。

请注意,我还没有尝试在这里订阅fetchUserData(),我希望isAuthenticated() 的调用者这样做。这通常会发生在 Angular 的 CanActivate Router Guard 中。

【问题讨论】:

  • 看起来你有一个Observable&lt;Observable&lt;…&gt;&gt;,你需要在某个时候变平
  • pipe() 调用中的map 是什么?
  • 谢谢,这就是我希望了解的方法! pipe(map(...)) 存在是因为 fetchUserData() 返回一个 Observable&lt;User&gt; 而我应该返回一个 Observable&lt;boolean&gt;。但也因为在返回任何内容之前,我需要存储 fetchUserData() 返回的 user 的值——因为我假设将调用 isAuthenticated 的人将 subscribe 给它,我希望代码(存储user) 将始终被执行。

标签: angular promise observable


【解决方案1】:

看来您只需要将内部 Observable 展平(我没有对此进行测试,但希望您能明白这一点):

return fromPromise(this.renewTokens())
  .pipe(
    concatMap(() => this.fetchUserData()
      .pipe(
        map(user => {
          // store the user object somewhere
          return user !== null;
        })
      );
    ),
    catchError(error => {
      this.ctx.log.error('Token renewal error', error);
      return of(false);
    }),
  );

【讨论】:

  • 我明白你在做什么;对于这种用法,我从来没有找到足够合理的concatMap 描述。他们是否有义务使用第一个 fromPromisepipe 或者您认为这可以进一步优化吗?我看到你完全删除了 .then().catch() 块。
  • 我假设 this.fetchUserData() 返回 Observable。如果不是,您需要用fromPromise 包装它。我不明白你有什么问题concatMap
  • 你猜对了!绝对没问题,除了我以前从未使用过它,我需要知道为什么它会解决问题,而我已经有效地尝试使用它来达到相同的目的。但这是我的研究任务:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2021-02-04
相关资源
最近更新 更多