角度工厂.success和.error函数

时间:2015-07-27 17:02:33

标签: javascript angularjs http factory

我是棱角分明的新手,我想知道在控制器内或工厂内放置.success.error函数的最佳做法是什么?例如:

我是否使用它:

(function(){
    'use strict';

    angular
    .factory('apiService', function($http){
        var apiService = {
            getProfileData: getProfileData
        }

        return apiService;

        function getProfileData(url){
            return $http.jsonp(url);
        }

    });
})();

或者这个:

(function(){
    'use strict';

    angular
    .factory('apiService', function($http){
        var apiService = {
            getProfileData: getProfileData
        }

        return apiService;

        function getProfileData(url){
            return $http.jsonp(url)
                .success(function(data){
                    return data;
                })
                .error(function(err){
                    return err;
                });
        }

    });
})();

我应该如何在控制器中处理它?<​​/ p>

4 个答案:

答案 0 :(得分:3)

您绝对应该选择您发布的第二个选项并在服务中处理它。服务是可重用的,因此如果没有在那里进行错误处理,则必须在每个使用它的控制器中完成。

编辑: 此规则的例外情况是,如果根据使用该服务的控制器完成不同的错误和成功处理,但我从未发现这是我的情况。

答案 1 :(得分:0)

我建议在服务/工厂使用它。控制器不需要知道通信实现(您可能希望将来模拟)。

关注点分离。 :)

答案 2 :(得分:0)

这两种方法都是正确的,但取决于您希望如何公开API。

第一种方法

这很简单。只有在您完全控制$http响应中可用的所有方面(例如数据,标题,状态和放大器)时,才应采用此方法。配置

第二种方法

通过使用此方法,您可以在callee方法和方法之间创建一个抽象层。 service,它将返回来自服务的数据,响应的其他部分将隐藏为callee方法。此外,您可以执行一些数据操作操作有时您还可以在返回数据之前进行验证。你可以根据条件解决或拒绝承诺。

我建议您选择第二种方法,以便在将数据返回到被调用方法之前获得更多数据访问权。

答案 3 :(得分:0)

你应该选择第二个选项,但是currentColor会返回一个承诺,但会提供稍微方便的语法,其中.success是promise API的全部功能但稍微冗长,所以尽管使用了.success我建议你更喜欢.then