我的应用程序中有一个数据服务,负责为我的控制器检索信息。此信息可能来自本地存储、窗口或 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
}));
但我不觉得这很优雅。有没有更好/正确的方法来做到这一点?