从一个返回Observable的Promise返回一个Observable

时间:2018-04-19 09:44:50

标签: angular promise observable

我有以下功能:

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)然后使用返回fetchUserData()的{​​{1}}函数获取用户配置文件。我想将此用户个人资料存储在某处,然后返回Observable<User>,如图所示。

当然上面的回复Observable<boolean>我完全理解,但不知道如何解决。

请注意,我还没有尝试订阅error TS2322: Type 'Promise<boolean | Observable<boolean>>' is not assignable to type 'Observable<boolean>'.,我希望fetchUserData()的来电者能够这样做。这通常发生在Angular的CanActivate Router Guard

1 个答案:

答案 0 :(得分: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);
    }),
  );