控制器和服务之间的$ http任务的最佳关注点分离方法

时间:2016-10-27 10:10:36

标签: angularjs angular-http separation-of-concerns

(使用Angular 1.5)

关于$ http请求,承诺和关注点分离的主题阅读了许多文章(一些最近的,一些旧的/过时的),目前正在尝试下面的示例(Plunker here)。

希望得到一些关于以下心理难题的反馈意见:

关于$http.get()请求,我是否做得足以确保控制器和注入服务之间的问题分开?

我理解控制器可能不是处理错误回调的责任,但我在想:如果确实发生了http错误(例如服务器关闭),那么控制器肯定会执行一些应急任务例如取消加载微调器,重定向到错误页面等

很抱歉,如果这个问题看起来过于通用 - 我希望下面的用例是可以接受的。

( function () {

var app = angular.module('myApp', []);

app.service('userService', ['$http', '$q', function($http, $q) {

    this.getUsers = function(url){

        return $http.get(url).then(
            function(response) { // success
                return response.data;
            })['catch']( // error ('catch' workaround for IE8)
                function(response) {
                    return $q.reject(response);
                }
            );

    };

}]);

app.controller('usersCtrl', ['$scope', 'userService', function($scope, userService){

    $scope.getUsersData = function(url) {

        userService.getUsers(url).then(
            function(data){ // success - set $scope data, cancel spinner, etc
                console.log(data);
            },
            function(error){ // error - cancel spinner and display error messages, or possibly redirect to custom error page, etc
                console.log(error);
            }
        );

    };

    $scope.getUsersData('dummyData.htm');

}]);

}());

2 个答案:

答案 0 :(得分:1)

控制器负责处理来自服务调用的错误回调(例如重定向到某个错误页面......)。 您的用例示例是完美的:服务只在成功时返回response.data或在出现错误时返回$q.reject(response),并且控制器处理成功和错误情况......

答案 1 :(得分:1)

看起来像是一个很好的分离问题。我完全按照你在我的一个项目中描述它的方式做到了:)

问题:为什么不直接在服务的getUsers函数中设置url?它改变了吗?

顺便说一下: 你可以从角度中恢复承诺..

$("#fieldName").prop("readonly", true);

...并使用成功和错误回调:

    this.getUsers = function() {
       return $http.get(this.appConfig.baseApiUrl + "/users");
    };

您可以直接从响应中获取数据。它看起来更干净;)