我的应用程序中有一个数据服务,负责检索控制器的信息。此信息可能来自本地存储,窗口或ajax请求。我面临的问题是$q
承诺回复看起来不像$http
。
this.getContactDetails = function(data) {
// The first time this method is called, we expect contact details to be preloaded on the page.
// We want to read and return that object then remove it from the page so subsequent requests are to the server.
if(typeof $window.preloadData.contact !== 'undefined') {
var contactDetails = JSON.parse(JSON.stringify($window.preloadData.contact));
delete $window.preloadData.contact;
// Since the method call should always have the same return type, we manually create a deferred object and set the resolution using the $q service.
var deferred = $q.defer();
deferred.resolve(contactDetails);
return deferred.promise;
}
var request = requests.contactDetails.get;
return $http(request);
};
$q
服务在这里做得很好,但它解析为给定的对象。我真的不希望它包装回应。我知道$httpBackend
可以完成此任务。
$httpBackend.whenGET(request).respond(contactDetails);
但该服务在MockE2E库中使用,我怀疑这是它的预期用途。我不确定如何在之后调用它,或者如果我在同一请求中使用它两次会发生什么,但我可以找出这些问题。我的另一个问题是,似乎没有办法将相同的配置对象传递给$ httpBackend,就像我对$ http一样。 $ httpBackend只接受方法,url,正文和标题,而$ http config允许我指定参数。
目前,我的解决方法就是自己创建和$ http-like包装器。
var contactDetails = JSON.parse(JSON.stringify({
data: $window.preloadData.contact
}));
但我觉得这不是很优雅。有没有更好/更正确的方法呢?
答案 0 :(得分:1)
您可以将您的存储层实施为$cacheFactory,并在配置阶段将其添加到$httpProvider。
来自文档:
启用缓存后,$ http将来自服务器的响应存储在指定的缓存中。下次发出相同的请求时,响应将从缓存中提供,而不向服务器发送请求。
因此,如果您使用以下方法提供自己的缓存实现:
- {object} info() - 返回缓存的id,size和选项。
{{*}}
put({string} key,{*}
value) - 将新的键值对放入缓存并返回。{{*}}
get({string} key) - 返回密钥的缓存值或缓存未命中的未定义值。- {void} remove({string} key) - 从缓存中删除键值对。
- {void} removeAll() - 删除所有缓存的值。
- {void} destroy() - 从$ cacheFactory中删除对此缓存的引用。
您可以返回从localStorage
,会话cookie等读取的值,并且它们将被视为从服务器发送data
,只是没有AJAX请求。