Angular2错误拦截器不重发请求

时间:2017-01-02 09:14:36

标签: angular angular2-http

我有一个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(...);
});

然而,响应结构发生变化,需要我更改代码以处理过期前请求和过期后,这是我想避免的。

0 个答案:

没有答案