1

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

另外,我在另一个问题 {1} 中看到了类似的解决方案,但这并不相同。仅仅返回响应$http.get().then()会将整个响应暴露给响应的控制器,这不是预期的效果。相反,当我调用 时MyService.getFoo().then(...),我期待一个foo对象作为来自服务的响应,由服务器通过 馈送response.data.foo,或者调用errorCallback.

我忘了提一下:我的服务器不是 RESTful 的,所以$resource现在不是一个选项。我的网址更像/thing/get/:id, /thing/do-stuff/:id

{1} 类似问题

4

1 回答 1

0

想了一会儿,我想出了一个更好的方法来编写服务。我对响应做了一些更改,现在我的实现在控制器调用或任何 http 方法$http时返回一个 Promise 。http.get()通过这个实现,在大多数情况下,我已将每个请求的方法代码减少到两三行。现在我应该尝试使用 AngularJS 装饰器设置。

一个工作示例在这里:

http://embed.plnkr.co/p4EHQAbE40XWXjBWqjIM/preview

于 2013-10-14T18:09:16.200 回答