处理控制器中的服务错误

Kyl*_* V. 2 error-handling angularjs angularjs-scope

在我的AngularJS应用程序中,我将从控制器中删除所有$ http.get()调用并将它们放入名为$ myService的自定义服务中,该服务将生成http请求并将promise对象返回给调用服务的控制器.这样做的原因是从我的控制器中删除复制和粘贴代码,所有这些代码都以相同的方式获取http资源,并且所有这些代码都具有错误处理逻辑,这些逻辑也被复制和粘贴.

我遇到的设计问题是我希望错误处理逻辑在一个地方定义并且可以被任何控制器使用.控制器应该能够从服务请求字符串资源并将它们分配给范围$scope.ButtonText = $myService.resources.ButtonText;,这是理想的,因为它只是一行没有逻辑的代码.问题是,如果错误处理逻辑在服务中,那么我不能(或不应该至少)从服务内部修改范围.我想要的是如果错误处理逻辑确定出错了那么它应该返回一个空字符串到控制器并将$ scope.error设置为适当的错误消息.

因为我不想在服务中使用范围操作,所以我首先想到的是我可以让控制器处理错误.例如,如果http请求出现问题,则调用$myService.resources.ButtonText可以返回null,然后控制器可以在每次返回空值时都采用错误.这个问题是我必须将这个错误处理逻辑复制并粘贴到每个控制器中,撤消我的重构工作!

如何在这种情况下集中错误处理逻辑?

Mar*_*yer 5

所以基本上任何时候都有一个http错误,而不是一个行为,比如转发到错误页面,你希望控制器可以使用特定错误,而不必.success().error()在每个方法中编写一堆样板文件.

您可能尝试的事情是从您的服务广播错误,然后您可以随时随地收听.拥有一个可以监听的服务或者可能是一个处理在页面上提供错误反馈的控制器可能会很方便.

也许是这个基本想法的变体:

services.factory('myService', ['$q', '$http', '$rootScope', function( $q, $http, $rootScope){
    function getSomething(someID){

        $http.get(url).success(function (data) {
            deferred.resolve(data);
        }).error(function(error) {
            $rootScope.$broadcast('http-error', { foo: 'bar' });
            deferred.reject(null);
        });
Run Code Online (Sandbox Code Playgroud)

然后在某个地方,无论是控制器还是注入控制器的服务,您都可以捕获错误并访问所需的信息:

$rootScope.$on('http-error', function handler(obj) {
    //handle error
    console.log("error:", obj)

 });
Run Code Online (Sandbox Code Playgroud)

如果将此写入服务,则可以将错误保存在服务中,而不是注入服务的任何控制器可用的错误,即 myErrorService.httpError