【问题标题】:Return Observable From Promise That Gets Rejected从被拒绝的 Promise 中返回 Observable
【发布时间】:2021-02-04 19:15:36
【问题描述】:

我正在尝试确定如何/是否可以将 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&lt;Credentials&gt;,如果它拒绝,我如何冒泡错误?

我知道如果我将身份验证服务函数更改为返回 Promise&lt;Observable&lt;Credentials&gt;&gt;,我可以让一切正常工作,这很好,但为了学习新事物,我试图弄清楚这是否可能。

【问题讨论】:

    标签: javascript angular typescript rxjs6 feathersjs


    【解决方案1】:

    您可以使用from function 将任何Promise 转换为Observable

    import { from } from 'rxjs';
    
    // ...
    
    class YourClass {
      login(context: LoginContext): Observable<Credentials> {
        return from(this.server.authenticate(LoginContext).then(result => {
          const credentials: Credentials = {
            username: result.user.username,
            token: result.accessToken
          }; 
          this.credentialsService.setCredentials(credentials, context.remember);
          return credentials;
        }));
      }
    }
    

    【讨论】:

    • 如果 promise 被拒绝会怎样?
    • 完美!我一直在尝试使用from,但一直试图过早地捕获 Promise 拒绝,这导致函数返回错误的类型。这真的帮助我理解了这一切是如何协同工作的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2018-11-25
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多