将 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);
}
});
}
有人可以帮助将此 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);
}
});
}