我试图找出一种优雅的方式来编写 AngularJS 服务,而不用重复使用 $q 语法。
目前,我正在编写如下服务:
(function() {
function ServiceFactory($q, $timeout, $http) {
return {
getFoo: function() {
var deferred = $q.defer();
$timeout(function() {
$http.get('/the/foo/thing').then(function(response) {
if (response.isError) {
deferred.reject();
} else {
deferred.resolve(response.data.foo);
}
}, function() {
deferred.reject();
});
});
return deferred.promise;
}
};
}
angular.module('myapp').service('MyService', ['$q', '$timeout', '$http', ServiceFactory]);
}.call(this));
它工作得很好,买我总是写一堆代码只是为了延迟 $http.get 并暴露一个 Promise。有时我会在成功回调中添加一些额外的东西,比如处理数据、创建不同的响应对象……但大多数时候,就像上面的代码一样:call $q.defer + $http.get().then... + return promise
所以,我正在考虑一种方法来清理/减少代码而不影响我正在做的事情的清晰度,例如,如果另一个开发人员打开文件,它不应该是一个谜。
附带说明一下,这里的 $http 服务实际上是一个装饰器,处理服务器响应,为我提供一个更结构化的对象,其中包含response.isError
和response.data
。
另外,我在另一个问题 {1} 中看到了类似的解决方案,但这并不相同。仅仅返回响应$http.get().then()
会将整个响应暴露给响应的控制器,这不是预期的效果。相反,当我调用 时MyService.getFoo().then(...)
,我期待一个foo
对象作为来自服务的响应,由服务器通过 馈送response.data.foo
,或者调用errorCallback
.
我忘了提一下:我的服务器不是 RESTful 的,所以$resource
现在不是一个选项。我的网址更像/thing/get/:id
, /thing/do-stuff/:id
。