在我的应用程序中,我正在为 $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...
};
}
关于javascript - 具有服务依赖性的 $log 装饰器导致循环依赖错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23416924/