是否适合在生产中使用$ httpBackend来抽象数据服务请求?

时间:2014-02-18 20:27:53

标签: angularjs angular-http

我的应用程序中有一个数据服务,负责检索控制器的信息。此信息可能来自本地存储,窗口或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
}));

但我觉得这不是很优雅。有没有更好/更正确的方法呢?

1 个答案:

答案 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请求。