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

前端之家收集整理的这篇文章主要介绍了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');
    });
原文链接:https://www.f2er.com/angularjs/145393.html

猜你在找的Angularjs相关文章