angularjs – 如何在响应拦截器中再次发送请求?

我在我的应用程序中检测会话丢失(服务器发送HTTP 419)拦截器。在这种情况下,我需要从服务器请求一个新的会话,然后我想自动发送原始请求。
也许我可以保存请求在请求拦截器,然后再发送,但可能有一个更简单的解决方案。

注意,我必须使用特定的webservice来创建会话。

angular.module('myapp',[ 'ngResource' ]).factory(
    'MyInterceptor',function ($q,$rootScope) {
        return function (promise) {
            return promise.then(function (response) {
                // do something on success
                return response;
            },function (response) {
                if(response.status == 419){
                    // session lost
                    // create new session server-side
                    // Session.query();
                    // then send current request again
                    // ???
                }
                return $q.reject(response);
            });
        };
    }).config(function ($httpProvider) {
        $httpProvider.responseInterceptors.push('MyInterceptor');
    });
这里是我的解决方案使用承诺的那些感兴趣。基本上,您需要请求一个新的会话,并等待响应,然后发送对应于原始请求的新请求(使用response.config)。通过返回promise $ http(response.config),您确保响应将被视为是原始请求。
(语法可能不是最好的,因为我是新的promises)
angular.module('myapp',function (response) {
                if(response.status == 419){
                    // session lost
                    var Session = $injector.get('Session');
                    var $http = $injector.get('$http');
                    // first create new session server-side
                    var defer = $q.defer();
                    var promiseSession = defer.promise; 
                    Session.query({},function(){
                        defer.resolve();
                    },function(){
                       // error
                       defer.reject();
                    });       
                    // and chain request
                    var promiseUpdate = promiseSession.then(function(){
                        return $http(response.config);
                    });
                    return promiseUpdate;
                }
                return $q.reject(response);
            });
        };
    }).config(function ($httpProvider) {
        $httpProvider.responseInterceptors.push('MyInterceptor');
    });

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...