使用带有$ exceptionHandler的$ http

时间:2015-08-25 00:03:55

标签: angularjs

我想发布角度应用程序中发生的错误。

我按照这个related question给出的方法,如答案所示,我注入了$ injector,然后从那里获得了$ http服务。 但行

  

未捕获错误:循环依赖:$ http< - $ exceptionHandler< - $ rootScope

不断前来。

here is the fiddle with the problem

使用相关代码:

var mod = angular.module('test', []);
mod.config(function ($provide) {
    $provide.decorator("$exceptionHandler", ['$delegate', '$injector',             function ($delegate, $injector) {
      var $http = $injector.get("$http");
    }]);
  });
mod.controller('testCtrl', function ($scope) {
  });

如果您对该行发表评论

  

var $ http = $ injector.get(" $ http");

循环依赖性错误消失了。

我认为我在理解中遗漏了一些东西。我究竟做错了什么?毕竟,这似乎对其他人有用。

有关如何实现我向服务发布错误的初始目标的任何建议'也欢迎。

谢谢大家

2 个答案:

答案 0 :(得分:4)

将您的注射器代码包装在函数

var mod = angular.module('test', []);
mod.config(function ($provide) {
    $provide.decorator("$exceptionHandler", ['$delegate', '$injector',function ($delegate, $injector) {
           return function (exception, cause) {
              var $http = $injector.get("$http");
           }
    }]);
  });

  mod.controller('testCtrl', function ($scope) {
  });

答案 1 :(得分:3)

你可以这样做。

这会破坏您的循环依赖性错误,您也可以实现目标。

如果我没有错,那么你只想在异常处理程序中调用Web服务。

var httpCallOnAngularError = angular.module('exceptionTestApp', []);

/*httpCallOnAngularError.factory('$exceptionHandler', function () {
 return function (exception, cause) {
        alert(exception.message);
    };
});*/

httpCallOnAngularError.config(function ($provide) {
    $provide.decorator("$exceptionHandler", function ($delegate, $injector) {
        return function (exception, cause) {
            var $rootScope = $injector.get('$rootScope');
            $delegate(exception, cause);
            $rootScope.logAngularError();
            alert(exception.message);
        };
    });
});
httpCallOnAngularError.run(function ($http, $rootScope) {
    $rootScope.logAngularError = function () {
        //Call your webservice here.
        $http.get("http://jsonplaceholder.typicode.com/posts/1")
                .success(function (response) {
                    console.log(JSON.stringify(response));
                });
    };

});

httpCallOnAngularError.controller('exceptionTestCtrl', function ($scope) {
    throw {message: 'Log this error by calling webservice.'};
});

您可以通过此模板进行验证。

<div ng-app="exceptionTestApp" ng-controller="exceptionTestCtrl">
</div>

Webservice call in Exception Handler $http in $exceptionHandler