官方的restangular文档
provides这个代码示例在ErrorInterceptor中重试一个请求:
@H_403_1@var refreshAccesstoken = function() {
var deferred = $q.defer();
// Refresh access-token logic
return deferred.promise;
};
Restangular.setErrorInterceptor(function(response,deferred,responseHandler) {
if(response.status === 403) {
refreshAccesstoken().then(function() {
// Repeat the request and then call the handlers the usual way.
$http(response.config).then(responseHandler,deferred.reject);
// Be aware that no request interceptors are called this way.
});
return false; // error handled
}
return true; // error not handled
});
但是,正如它在评论中所说,第二次尝试不会触发任何拦截器,因为它直接使用$http.
有没有办法让第二个请求也通过Restangular管道并执行ErrorInterceptor?
实际上,使用Restangular进行的请求使用的promise只能被解析一次.如果拒绝,您无法重新发送.
我真的不知道你是否想要一个可重用的errorInterceptor,但是服务的工作方式似乎不允许简单地从响应对象配置重新构建一个Restangular对象.
你可以做的一件事是保存对象的引用,然后在拦截器中使用它.
你应该有你的理由,但是我必须用这个来警告你,因为如果失败并且如果它仍然存在,你最终会得到一个无限的调用,因为Restangular总是会调用errorInterceptor.
我已经为演示模拟了一个小小的Plunkr,只需打开你的网络选项卡然后点击按钮,你应该看到所有请求都在那里.