Angularjs 如何知道依赖项何时可用

Angularjs 如何知道依赖项何时可用,angularjs,Angularjs,鉴于以下情况,$injector.get将失败,因为$rootScope不可用 app.factory('$exceptionHandler', ['$injector', $injector => { const $rootScope = $injector.get('$rootScope') return (exception, cause) => { // code } }) 在研究过程中,我不断遇到这个问题,它在运行时(当调用内部函数时)被解析时起作用

鉴于以下情况,
$injector.get
将失败,因为
$rootScope
不可用

app.factory('$exceptionHandler', ['$injector', $injector => {
  const $rootScope = $injector.get('$rootScope')

  return (exception, cause) => {
    // code
  }
})
在研究过程中,我不断遇到这个问题,它在运行时(当调用内部函数时)被解析时起作用

我想知道的是我什么时候可以解决依赖关系。比如:

app.factory('$exceptionHandler', ['$injector', $injector => {
  $injector.illLetYouKnowWhenWeCanDoStuff().then(() => {
    const $rootScope = $injector.get('$rootScope')
  })

  return (exception, cause) => {
    // code
  }
})
这可能吗

相关=>

所有通过正常角度功能(工厂、服务、控制器等)注册的注射剂都可以立即在bootstrap上使用<代码>$rootScope未正常注册。它是在应用程序引导后提供的。由于
$exceptionHandler
已立即实例化,
$rootScope
尚不可用

绕过循环依赖错误的最佳方法是打破循环。让您的
$exceptionHandler
依赖于您构建的自定义服务。在注入
$rootScope
.run()
块中配置该新服务

app.factory('$exceptionHandler', ['myExceptionHandlingConfig', function(myExceptionHandlingConfig) {

  return function(exception, cause) {
    //do exceptional stuff
  }

}]);

app.factory('myExceptionHandlingConfig', function() {

  return {};

});

app.run(['$rootScope', 'myExceptionHandlingConfig', function($rootScope, myExceptionHandlingConfig){

  myExceptionHandlingConfig.someProperty = $rootScope.something;

}]);

注意:
$rootScope
在引导时将非常空,因此您可能需要设置一个
$watch
,以便在您查找的任何数据可用时更新服务。

为什么要注入器,而不是一开始就注入$rootScope?注入器将找出依赖项,从而创建$rootScope并在创建exceptionHandler之前注入它。另外,请注意,
$
前缀正好用于区分角度服务和您自己的服务。所以你不应该在你的服务前面加上
$
@jbnize。不要阅读我在底部链接的问答,你指的是我的什么服务?本地$rootScope?@JBNizet$injector是第二个示例(以及我当前的解决方案)工作所必需的,但在第一个示例中它可能不相关(无论哪种方式都是相同的错误)。通常,一旦应用程序启动,所有将可用的注入程序都可用。新服务通常不会在运行时添加。也许,如果你能从更高的层面解释你想要达到的目标,有人会帮助你。@JCFord当然。我只需要从工厂里的$rootScope那里得到一些东西。问题是它最初还没有准备好,但我可以在一段时间后得到它(即内部功能)
app.factory('$exceptionHandler', ['$injector', $injector => {
  const $rootScope = $injector.get('$rootScope')

  return (exception, cause) => {
    // code
  }
})