You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:22:53