我目前正在使用以下代码重新抛出从我的API返回401的请求:
responseError: function(rejection) { var authData = localStorageService.get('authorizationData'); if (rejection.status === 401 && authData) { var authService = $injector.get('authService'); var $http = $injector.get('$http'); ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶ var promise = authService.refreshToken(); return ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶ promise.then(function () { return $http(rejection.config); }); } return $q.reject(rejection); }
这对于1个请求非常有用,但是如果我从单个页面返回两个401,则它似乎不起作用,例如当页面加载两个api调用以填充不同的部分时.如何让我的拦截器重新抛出多个延期调用?
此外,拦截器不应该单独为每个401射击吗?不理想,它会在单个页面上引起多次刷新调用,但由于调用未被重新抛出而导致数据缺失.
截图:
解决方法
一种方法是保存令牌保证并链接第二次和后续重试,直到令牌刷新完成:
responseError: function(rejection) { var authService = $injector.get('authService'); var $http = $injector.get('$http'); var tokenPromise = null; var authData = localStorageService.get('authorizationData'); if (rejection.status === 401 && authData) { if (!tokenPromise) { tokenPromise = authService.refreshToken() .finally(function() { tokenPromise = null; }); }; return tokenPromise.then(function () { return $http(rejection.config); }); } else { throw rejection; } }
在上面的示例中,拒绝处理程序创建一个令牌刷新承诺,然后在令牌刷新结束(满足或拒绝)时使其为空.如果在令牌刷新过程中发生另一次拒绝,则以链接(并延迟)重试,直到令牌刷新XHR完成.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。