我试图找出一种优雅的方式来编写 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。