angularjs - 在 Controller 中处理来自服务的错误

标签 angularjs error-handling angularjs-scope

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

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

因为我不想在服务中进行范围操作,所以我第一个也是唯一的想法是我可以让 Controller 处理错误。例如,如果 http 请求有问题,对 $myService.resources.ButtonText 的调用可以返回 null,然后 Controller 可以在返回 null 时假定错误.这样做的问题是我必须将此错误处理逻辑复制并粘贴到每个 Controller 中,从而使我的重构工作付诸东流!

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

最佳答案

所以基本上只要有一个 http 错误,而不是一个行为,比如转发到一个错误页面,你希望你的 Controller 可以使用特定的错误,而不必编写一堆 .success().error( ) 每种方法中的样板文件。

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

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

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);
        });

然后在某个地方,无论是 Controller 还是您注入(inject) Controller 的服务,您都可以捕获错误并访问您想要的信息:

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

 });

如果您将其写入服务,那么您可以将错误保存在服务中,而不是将它提供给任何注入(inject)该服务的 Controller ,即 myErrorService.httpError

关于angularjs - 在 Controller 中处理来自服务的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24914241/

相关文章:

angularjs - 将对象作为属性传递给动态编译指令

python - 使用QFileDialog getOpenFileName()时出现UnicodeDecodeError

javascript - Angular : strange behavior with ngCookies

javascript - ng-model 不会在文本过滤器的单个按键上重新计算数组长度

AngularJs 自定义指令隔离范围自定义字段

javascript - AngularJS:如何在初始化期间在 Controller 之间传递数据?

php - 如何从 CodeIgniter 中失败的数据库查询中恢复?

angularjs - Angular.js 传递范围属性作为对指令的引用?

angularjs - 在子指令之前摘要更新父 Controller

error-handling - 如何在LotusScript中捕获错误消息