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 // 但是如果要撤回已经发出的请求的话应该是做不到的吧