我有一个angular2错误拦截器可以捕获我的HTTP抽象中的所有失败,我的问题是当我捕获错误并返回一个新的observable时,传递给.flatMap()的observable没有被触发。
以下是发出请求的http客户端实现示例:
return this._http.get(endpoint, data || {}, opts)
.map(this.responseInterceptor)
.catch(error => this.errorInterceptor({
method: method,
endpoint: endpoint,
data: data || {},
options: options
}, error));
这是错误拦截器
/**
*
* @param request
* @param error
* @returns {any}
*/
errorInterceptor(request: any, error: any): any {
if (error.status === 401) {
let tokenRequest = this.getToken({refresh_token: localStorage.getItem('refresh')}, 'refresh_token').map(res => {
localStorage.setItem('token', res.access_token);
localStorage.setItem('refresh', res.refresh_token);
request.data.headers.set('Authorization', 'Bearer ' + res.access_token)
})
return tokenRequest.flatMap(res => this.request(request.method, request.endpoint, {}, request.data, false));
}
return this.handleError(error);
}
问题是只调用了令牌请求,传递给.flatMap()
的请求永远不会被调用。
我可以通过以下方式解决这个问题:
tokenRequest.subscribe(res => {
// logic here
return this.request(...);
});
然而,响应结构发生变化,需要我更改代码以处理过期前请求和过期后,这是我想避免的。