angularjs 如何取消未完成的http请求?

当有多个$http请求,如何做到只保留最后一次的请求,取消未完成的其它http请求?

求解!

阅读 4.5k
1 个回答

app.factory('$httpCovered',['$http', function($http){
    var urlMap = {};
    var functionFactory = function (fn) {
        return function () {
            // 保存请求的参数
            var args = [];
            for (var i in arguments) {
              args.push(arguments[i]);
            }
            // 获取url 已经该URL已经调用了几次了
            var url = typeof args[0] === 'string' ? args[0] : args[0].url;
            var index = url in urlMap ? ++urlMap[url] : (urlMap[url] = 0)

            // 调用原来的http的方法
            var res = fn.apply($http, args);
            var originSuccess = res.success;
            // 覆盖success回调
            res.success = function (callback) {
                var newCallback = function (res) {
                  // 如果请求返回的时候该url没有再调用过则执行回调  否则直接返回
                  index === urlMap[url] && callback(res);                    
                };
                return originSuccess.call(res, newCallback);
            };
            // 如果需要则也重写error 方法
            return res;
        };
    };
    // 覆盖http 以及 http.post和http.get
    var httpFn = functionFactory($http);
    httpFn.post = functionFactory($http.post);
    httpFn.get = functionFactory($http.get);
    httpFn.setRouteUrl = function (url) {
        currentRouteUrl = url;
    };
    return httpFn;
}]);

// 然后在别的controller或者service中使用$httpCover代替$http
// 但是如果要撤回已经发出的请求的话应该是做不到的吧
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进