从被拒绝的承诺中观察到的回报

问题描述

我正在尝试确定如何/是否可以将Promise拒绝转换为类型化的Observable。

我有一个具有这样功能的登录组件...

login() {
  const login$ = this.authenticationService.login(this.loginForm.value)
  login$
  .pipe(
    finalize(() => {
      this.loginForm.markAsPristine();
      this.isLoading = false;
    }),untilDestroyed(this)
  )
  .subscribe(
    (credentials) => {
      log.debug(`${credentials.username} successfully logged in`);
      this.router.navigate([this.route.snapshot.queryParams.redirect || '/'],{ replaceUrl: true });
    },(error) => {
      log.debug(`Login error: ${error}`);
      this.error = error;
    }
  )
}

以及使用这种方法的身份验证服务...

login(context: LoginContext): Observable<Credentials> {

  var data = {} as Credentials
  
  // Call a method that returns a Promise
  this.server.authenticate(LoginContext)
  .then((result) -> {
      data.username = result.user.username
      data.token = result.accessToken
      this.credentialsService.setCredentials(data,context.remember)
      // Not sure what to do here...need to return data somehow as an Observable
      // return data
    })
  .catch((err) => {
      // Not sure what to do here either...need to bubble the err up so that it's caught in subscribe
      // return throwError(err)
    })
}

如果Promise解决了,如何返回Observable<Credentials>,如果拒绝则冒出错误?

我知道,如果我将身份验证服务功能更改为返回Promise<Observable<Credentials>>,就可以使所有工作正常,但是为了学习新事物,我试图弄清楚这是否可行。 / p>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)