将 Promise 转换为 RxJs Observable

Convert Promise to RxJs Observable

有人可以帮助将此 promise 转换为 RxJs observable 吗? 我想从本地存储中获取令牌,如果出错,它应该被订阅可观察的观察者捕获。以下是 Promise 的现有解决方案:

  getToken(): Promise<any> {
    return new Promise<any>((resolve, reject) => {
      resolve(JSON.parse(localStorage.getItem('currentUser')).token);
      reject();
    });
  }

订阅者是:

 this.authService.getToken().then(token => {
      this.token = token;
    }).catch(() => console.log('Error! cannot get token'));

我尝试使用以下方法将其转换为 Observable:

 getToken2(): Rx.Observable<number> {
    return Rx.Observable.create(obs => {
      obs.next(JSON.parse(localStorage.getItem('currentUser')).token);
       obs.error('Error! cannot get token');
    });
  }

  this.authService.getToken2()
  .subscribe((token) => console.log(token), (er) => console.log(er));

但问题是,当从本地存储获取令牌时发生错误时,RxJs observable 不会通过 obs.next() 捕获它。就像它已解决 successfully.Whereas Promise 成功捕获它via reject method.Can 有人知道出了什么问题吗?谢谢

你不需要做所有这些,只需使用 from():

import { from } from 'rxjs';

from(this.authService.getToken())
  ...
  .subscribe(...)

如果您想在 Observable 链中的任何地方使用 Promise,您甚至不需要将其转换为 Observable,因为它会自动发生。

https://medium.com/@benlesh/rxjs-observable-interop-with-promises-and-async-await-bebb05306875

2019 年 4 月:针对 RxJS 6 更新

您的getToken()-方法应该有一些适当的错误处理。同时调用 resolve()reject() 是不好的,可能会导致意外行为。 最好这样做:

getToken(): Promise<any> {
  return new Promise<any>((resolve, reject) => {
    try {
      resolve(JSON.parse(localStorage.getItem('currentUser')).token);
    catch(err) {
      reject(err);
    }
  });
}

话虽如此,getToken2() 也应该有适当的错误处理,例如:

getToken2(): Rx.Observable<number> {
  return Rx.Observable.create(obs => {
    try {
      obs.next(JSON.parse(localStorage.getItem('currentUser')).token);
    catch(err) {
      obs.error(err);
    }
  });
}