http://jsfiddle.net/G23h7/
我创建了两个服务来完成我认为你想要完成的事情。第一个提供核心功能来接收一个承诺和一个对象(或数组),并在承诺解决时更新所述对象或数组。有一个 GUI 供您使用。
第二个服务将其集成到$http
. 基本上你可以做smartHttp.forArray(config)
和smartHttp.forObj(config)
代替$http(config)
. 如果您最终使用它并想要使用$http
快捷方法,那么这应该很容易实现。这是未经测试的 - 所以将其视为伪代码。如果您立即返回缓存值/无效值,那么使用承诺作为服务的返回值并没有真正意义smartHttp
(除非您试图使服务与 可互换$http
)。如果你希望它成为一个承诺或任何你可以改变的原因:
var general = function (obj, methodName) {
// ...
return obj;
};
到以下:
var general = function (obj, methodName) {
// ...
return $q.when(obj);
};
当然,然后要求提供$q
服务。这里真正的问题是请求之间的平等——我认为$http
这很好;我做了一个天真的键——你可能想改变它(只要你有简单的请求/对我认为不重要的所有东西都有相同的顺序)。
myApp.factory('smartCache', function () {
var service = {};
service.forArray = function (array, promise, clear) {
promise.then(function (promiseResult) {
if (clear) {
array.length = 0;
}
angular.forEach(promiseResult, function (promiseResultElement) {
array.push(promiseResultElement);
});
});
};
service.forObj = function (obj, promise, clear) {
promise.then(function (promiseResult) {
if (clear) {
for (var prop in obj) {
delete obj[prop];
}
}
for (var prop in promiseResult) {
obj[prop] = promiseResult[prop];
}
});
};
return service;
});
myApp.factory('smartHttp', function ($http, smartCache, $cacheFactory) {
var cache = $cacheFactory('smartHttp');
var service = {};
var general = function (config, methodName, initialValue) {
var obj;
var key = JSON.stringify([ config.url, config.method, config.params, config.data ]);
var cachedObj = cache.get(key);
if (cachedObj !== undefined) {
obj = cachedObj;
} else {
obj = initialValue;
}
var promise = $http(config);
var smartCachePromise = promise.then(function (result) {
return result.data;
});
smartCache[methodName](obj, smartCachePromise, true);
return obj;
};
service.forObj = function (config) {
return general(config, 'forObj', {});
}
service.forArray = function (config) {
return general(config, 'forArray', []);
}
return service;
});