微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

angularjs – 如何处理Angular responseError拦截器中的多个响应

我目前正在使用以下代码重新抛出从我的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射击吗?不理想,它会在单个页面上引起多次刷新调用,但由于调用未被重新抛出而导致数据缺失.

截图:

enter image description here

解决方法

一种方法是保存令牌保证并链接第二次和后续重试,直到令牌刷新完成:

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] 举报,一经查实,本站将立刻删除。

相关推荐