Angular 1.6工厂注入$http时出现循环依赖错误求助
解决Angular 1.6中$exceptionHandler注入$http的循环依赖问题
这个循环依赖问题的根源很明确:Angular的$http服务本身依赖$exceptionHandler,而你现在自定义的$exceptionHandler又反过来注入了$http,这就形成了一个无法解开的依赖循环链,所以框架抛出了那个错误。
想要解决这个问题,最常用且有效的方式是通过$injector延迟获取$http服务,而不是直接在工厂的依赖列表中注入它。这样可以避开初始化阶段的依赖冲突,打破循环链。
修改后的代码如下:
var app = angular.module("app", []); app.controller("ctrl", function($scope) { // controller 逻辑 }) .factory('$exceptionHandler', ['$log', '$injector', function($log, $injector) { return function myExceptionHandler(exception, cause) { $log.warn(exception, cause); // 延迟获取$http,避免循环依赖 var $http = $injector.get('$http'); // 在这里执行你的$http操作,比如上报错误到后端 $http.post('/your-error-log-endpoint', { errorMessage: exception.message, errorCause: cause, stackTrace: exception.stack }) .catch(function(logError) { // 处理上报失败的情况,避免二次异常 $log.error('Failed to log error:', logError); }); }; }]);
为什么这个方法有效?
$injector是Angular的核心服务,它负责管理所有服务的实例化,并且不依赖$http或$exceptionHandler。通过在异常处理函数内部才获取$http实例,而不是在工厂初始化时就注入,我们就切断了初始化阶段的循环依赖链条,让Angular能够正常完成服务的初始化流程。
另外需要注意的是,在错误上报的逻辑里最好加上异常捕获(比如上面的.catch),避免上报失败时再次触发异常处理,导致无限循环。
内容的提问来源于stack exchange,提问作者Kleith
相关产品推荐
相关产品推荐

