3

我的应用程序中有一个数据服务,负责为我的控制器检索信息。此信息可能来自本地存储、窗口或 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、body 和 headers,而 $http config 允许我指定参数。

目前,我的解决方法是自己创建类似 $http 的包装器。

var contactDetails = JSON.parse(JSON.stringify({
    data: $window.preloadData.contact
}));

但我不觉得这很优雅。有没有更好/正确的方法来做到这一点?

4

1 回答 1

1

您可以将存储层实现为$cacheFactory ,并在配置阶段将其添加到$httpProvider 。

从文档:

启用缓存后,$http 将来自服务器的响应存储在指定的缓存中。下次发出相同请求时,将从缓存中提供响应,而不向服务器发送请求。

因此,如果您使用以下方法提供自己的缓存实现:

  • {object} info() — 返回缓存的 id、大小和选项。
  • {{*}}put({string} key, {*}value) — 将新的键值对放入缓存并返回。
  • {{*}}get({string} key) — 返回键的缓存值或未定义的缓存未命中。
  • {void} remove({string} key) — 从缓存中删除一个键值对。
  • {void} removeAll() — 删除所有缓存值。
  • {void} destroy() — 从 $cacheFactory 中删除对该缓存的引用。

您可以返回从 、会话 cookie 等读取的值localStorage,它们将被视为data从服务器发送的,只是没有 AJAX 请求。

于 2014-02-18T21:57:42.343 回答