web-dev-qa-db-ja.com

PromiseをRxJsObservableに変換する

誰かがこの約束を観察可能なRxJに変換するのを手伝うことができますか?ローカルストレージからトークンを取得したいのですが、エラーが発生した場合は、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()を介してそれをキャッチしないことです。それは正常に解決されたようですが、Promiseはrejectメソッドを介して正常にキャッチします。誰かがアイデアを与えることができますか?なにが問題ですか?ありがとう

8

これをすべて行う必要はありません。 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月:RxJS6用に更新

8
martin

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);
    }
  });
}
_
1
smoebody