将 Promise 转换为 RxJs Observable

18

有人可以帮忙将这个 Promise 转换为 RxJs observable 吗?我想要从本地存储中获取令牌,如果出现错误,应该使用订阅了 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');
    });
  }

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

但问题是,当从本地存储获取令牌时出现错误时,RxJs可观察对象无法通过obs.next()捕获它。就好像它已经成功解决了一样。而Promise通过reject方法成功捕获它。有人能给个想法是怎么回事吗?谢谢。

2个回答

28

1
谢谢Martin的回答。但是我想将getToken方法本身转换为Observable。我不想使用Promise或fromPromise。你能写一下吗? - Vugar Abdullayev
我不明白你想做什么。你根本不想使用 Promises 吗?你能否制作一个演示来展示你想做的事情? - martin
没错。我根本不想使用 Promise。首先想用 Observable 来编写 getToken,而不是将其转换为 fromPromise。然后订阅此方法。 - Vugar Abdullayev
obs.error() 会发出一个错误,而 catch 只处理 error 的发射。问题可能在你的代码中的其他地方。 - martin
现在它可以工作了。我刚刚重新构建了项目。不知道为什么之前不能工作。谢谢你的帮助! - Vugar Abdullayev
显示剩余2条评论

2
你的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);
    }
  });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接