角 - 可观察到类似http.get但没有要求
问题描述:
我有这样的观察到的HTTP请求角 - 可观察到类似http.get但没有要求
refreshToken() {
return this.http.get(this.siteService.apiDomain() + '/api/token?token=' + localStorage.getItem('JWToken'), {})
.map((response: Response) => {
return response;
})
}
和我打电话观察到这样
return this.refreshTokenService.refreshToken()
.flatMap((result: any) => {
// if got new access token - retry request
if (JSON.parse(result._body).token) {
localStorage.setItem('JWToken', JSON.parse(result._body).token);
}
this.setHeaders(url);
return this.request(url, options);
})
而我的问题是,如果我有多个并行请求我多次使用refreshToken()。我想找到一种方法来做一个假的http调用,并返回我已经知道的或者什么也不做的令牌。
Observable.empty() // Failed to compile (Type '{}' is not assignable to type 'Response'.)
Observable.empty().filter(() => {return true}) // Compiles but it stop the flatMap sequence.
答
我不知道我完全理解,但也许你想Observable.of()
?
这里是我使用它的一个例子。如果Id为0,它将返回一个初始化产品作为Observable。
import 'rxjs/add/observable/of';
...
getProduct(id: number): Observable<IProduct> {
if (id === 0) {
return Observable.of(this.initializeProduct());
};
const url = `${this.baseUrl}/${id}`;
return this.http.get(url)
.map(this.extractData)
.do(data => console.log('getProduct: ' + JSON.stringify(data)))
.catch(this.handleError);
}
答
我会建议使用BehaviourSubjects的,它可以让你存储的最后一个值,直到该组件销毁或你面对它改变。此外,当BehaviourSubject上的值发生更改时;每个订阅了它的组件都会收到新的数据。另外作为一个额外的好处,你不需要调用服务器evrytime组件想要获得像Observable这样的值,因为它存储的值,你可以随时获得该值,而无需调用服务器。 BehaviourSebject example