2017-04-21 37 views
1

我正在重写Angular $ exceptionHandler以执行一些自定义异常日志记录。不幸的是,我的日志记录服务使用$ http进行日志记录,这依赖于$ exceptionHandler。任何想法的模式,可以解决我的循环引用,仍然允许我通过$ http登录?

这里是我的服务覆盖$ exceptionHandler的:

angular.module('dashboard').factory('$exceptionHandler', ['$log', 'Logging', 
function($log, Logging){ 
    return function globalErrorHandler(exception, cause){ 
     var itemToLog = new logItem('dashboard', 'General Error', exception.message + ": " + exception.stack); 
     Logging.logEvent(itemToLog); 
     $log.warn(exception, cause); 
    } 
}]); 

和我的自定义日志记录服务:

angular.module('dashboard').factory('Logging', ['$http', function($http) { 
    return { 
     logEvent: function(item){ 
      $http.post('/api/loggingservice/event', item) 
       .success(function(data){ 
        return data; 
       }). 
      error(function(data){ 
       console.log('error logging event: '+JSON.stringify(data)); 
      });; 
     } 
    }; 
}]); 

我收到错误消息是: angular.min.js:6未捕获的错误:[$ injector:cdep] https://docs.angularjs.org/error/ $ injector/cdep?p0 = $ http%20%3C-%20Logging%20%3C-%20 $ exceptionHandler%20%3C-%20 $ rootScope%20%3C-%20 $ http%20%3C-%20UserManagement%20%3C-%20Menus

+0

请更新与错误信息的问题,你越来越。这将使它更清晰,更容易找到。 – estus

+0

我已经添加了错误信息,并且正在测试您的答案 - 看起来很有希望。 – DShultz

回答

1

$exceptionHandler$http依赖于的其他核心服务使用。这使得注入$http或取决于$http的服务不可能,因为这会导致循环依赖。

在Angular 1中避免CD的常用方法是使用$injector.get(...)而不是在服务工厂/构造函数中注入服务。但是,开发人员应该意识到为什么这样做以及它在那里发生了什么。

做这样的事情

function($log, $injector){ 
    var Logging = $injector.get('Logging'); 
    return function globalErrorHandler(exception, cause){ ... } 
} 

不会打破循环依赖,因为$exceptionHandler是热切的核心服务,$http依赖,这Logging取决于实例化。

在另一方面,

function($log, $injector){ 
    return function globalErrorHandler(exception, cause){ 
     var Logging = $injector.get('Logging'); 
     ... 
    } 
} 

会工作,因为这样Logging是懒洋洋地实例化。这将导致在每个处理程序调用上执行$injector.get(...)。但这很好,因为$injector.get(...)没有性能影响,可以多次调用,特别是在非关键位置。