誰かがこの約束を観察可能な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メソッドを介して正常にキャッチします。誰かがアイデアを与えることができますか?なにが問題ですか?ありがとう
これをすべて行う必要はありません。 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用に更新
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);
}
});
}
_