当调用请求的控制器丢失其范围时,如何在angularjs中中止http请求

时间:2014-05-12 12:06:12

标签: javascript angularjs http

我在angularjs中创建了一个使用ng-view的应用程序。通过路由提供者的肝脏,在ng-view中加载了四个不同的模块。 在每个模块中,我按以下方式发送http请求: -

var requestManager = {
    "locations": {},
    "employees": {},
    "items": {},
    "templates": {}
};
sendRequestToServer = function (reqObj) {
    var reqObj = reqObj,
        httpObj = {},
        defer = $q.defer();
    httpObj = {
        method: reqObj.method,
        url: baseUrl + reqObj.url,
        timeout: 90000
    };
    if (reqObj.method == 'GET') {
        httpObj['params'] = reqObj.data;
        if (reqObj.uniqueId) {
            httpObj['headers'] = {
                'uniqueId': uniqueId
            }
        }
    } else if (reqObj.method == 'POST' || reqObj.method == 'PUT') {
        httpObj['headers'] = {
            'Content-Type': 'application/x-www-form-urlencoded'
        };
        httpObj['data'] = reqObj.data;
    }
    requestManager[reqObj.moduleName][reqObj.requestName] = $http(httpObj).success(function (data, status, headers, config) {
        var dataObj = {
            data: data,
            status: status,
            headers: headers,
            config: config
        };
        defer.resolve(dataObj);
    })
        .error(function (data, status, headers, config) {
            var dataObj = {
                data: data,
                status: status,
                headers: headers,
                config: config
            };
            defer.reject(dataObj);
        });
    return defer.promise;
}

现在我的要求是: - 当路由从一个模块更改为另一个模块时,我想中止服务器通信中间的请求。 为此,我正在收听毁灭事件: -

$rootScope.$on('destroyModule', function(event, moduleName) {

    var requests = requestManager[moduleName]
        , defer = $q.defer()
        , index
        , req;
    for(req in requests){

    //Want abort the request
        defer.reject(requests[req]);

    }
})

但它不起作用..我认为我所做的是错的。任何人都可以帮助这个主题? 提前谢谢你

1 个答案:

答案 0 :(得分:0)

如果你还有另一个可以监听的范围(可能在一个视图控制器中?),那么在$ rootScope上不会触发destroy事件。你可以这样连接:

$scope.$on("$destroy", function(){ ... });

另一方面,如果你只想检测位置变化,你可以这样做:

$rootScope.$on("$locationChangeStart", function(){ ... });