javascript - 具有服务依赖性的 $log 装饰器导致循环依赖错误

标签 javascript angularjs

在我的应用程序中,我正在为 $log 编写装饰器这样我就可以自定义 $log 的功能包括调用第三方服务。第三方服务注入(inject)$q为其内部事件。现在这会导致循环依赖错误:

Uncaught Error: Circular dependency: $q <- tploggerService <- $log <- $exceptionHandler <- $rootScope .

因为 qProvider使用 exceptionHandlerProvider最终使用 logProvider我想这是造成这个的原因。有没有人在装修时遇到过类似的问题,是否有解决这个问题的解决方案或不同的模式来解决这个问题?

这是一个简单的代码演示,感谢您的帮助:

///Some third party APP
angular.module('SomeThirdPartyApp', []);

    tploggerService.$inject = ['$q']; //<-- $q is a dependency

    function tploggerService ($q) {

        this.info = function (data) {
            var deferred = $q.defer(); //Doing something...
            //....
            //....
     };
}

angular.module('SomeThirdPartyApp').service('tploggerService', tploggerService);

///--------------------------------------------------------------------------------
///MY APP
angular.module('decorApp', ['SomeThirdPartyApp']);

 angular.module('decorApp').config([
   '$provide', function ($provide) {
     $provide.decorator('$log', ['tploggerService','$delegate', 
       function (tploggerService, $delegate) { //<--- Injecting tpLoggerService causes circular dependency error.
         var _info = $delegate.info;
         //It is no different even if we use $injector
         $delegate.info = function(){
             var args; //doing something with the arguments basically formatting massaging it.
             var customlogmessage; //doing something with args

             tploggerService.info(customlogmessage);
             _info.apply(null, args);
         }
         return $delegate;
       }]);
   }]);

最佳答案

从您的服务内部获取 $q:

function tploggerService ($injector) {
    var $q;
    this.info = function (data) {
        $q = $injector.get('$q');
        var deferred = $q.defer(); //Yes using defered object. some this performs some actions and some internal stuffs.

        //Doing something...
    };
}

Updated Plunk

关于javascript - 具有服务依赖性的 $log 装饰器导致循环依赖错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23416924/

相关文章:

javascript - 需要使用 javascript/jquery 为隐藏框添加淡出效果

angularjs - 变量 'name' 在页面加载时闪烁

javascript - 如何将多个 onError 函数分配给一个 Promise(由 Angular 的 $http.post 返回)

javascript - 使用 ANGULAR JS 和 Spring MVC 在 HTML 中动态显示添加/删除操作的结果

javascript - 网页开发 : Do we still need to support non-javascript users?

javascript - setState() 的异步性质不显示父组件更新的 props

javascript - .html() 返回空字符串

javascript - 保护对 url 和 rootScope 的访问未定义

javascript - 未选中复选框时清除输入 react

javascript - Famo.us 多边形碰撞支持