APP_INITIALIZER 之后服务实例化两次

2024-03-25

问题是:我需要进行 http 调用并存储生成动态路由所需的对象。所以,我利用了 APP_INITIALIZER。

// app.module.ts
import { ApplicationService } from './application.service';


providers: [
  ApplicationService,
  { 
  provide: APP_INITIALIZER, useFactory: appServiceFactory, deps: 
  [Injector, ApplicationService], multi: true 
  },
],

function appServiceFactory(injector: Injector, appService: ApplicationService): Function {
  return () => {
    return appService.loadApplication().then((app: Application) => {
      /custom logic
      });
    });
  };
}


// application.service.ts
@Injectable({
  providedIn: 'root'
})

// navigation.component.ts
import { ApplicationService } from './application.service';

export class NavigationComponent implements OnInit {

    constructor(private _applicationService: ApplicationService) {
  }
}    

但在navigation.component内部,applicationservice又被初始化了。我确信这一点,因为如果我记录或放置调试器语句,服务的 construct() 方法将被调用两次。

为什么即使服务被声明为单例providedIn: root正在重新实例化吗?


这样做的原因是,一旦你包括Router依赖于你的APP_INITIALIZER工厂你得到循环依赖(https://github.com/angular/angular/blob/4c2ce4e8ba4c5ac5ce8754d67bc6603eaad4564a/packages/router/src/router_module.ts#L61-L64 https://github.com/angular/angular/blob/4c2ce4e8ba4c5ac5ce8754d67bc6603eaad4564a/packages/router/src/router_module.ts#L61-L64).

ApplicationService
       |
    TestService
       |
     Router
       |
  ApplicationRef
       |
ApplicationInitStatus
       |
 APP_INITIALIZER
       |
ApplicationService

为了解决这个问题,你可以惰性地获取 Router:

export class TestService {

  get router() {
    return this.injector.get(Router)
  }

  constructor(private _http: HttpClient, private injector: Injector ) {
  }
}

叉式堆栈闪电战 https://stackblitz.com/edit/angular-h5mzak?file=src/app/test.service.ts

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APP_INITIALIZER 之后服务实例化两次 的相关文章

随机推荐

  • 暂停事件在 PhoneGap iPhone 中无法正常工作?

    这是我的代码 This is an event that fires when a PhoneGap application is put into the background document addEventListener paus
  • Go 语言中的打印格式列表

    只是想知道使用 fmt 包的功能的打印格式列表 例如 v 用于打印值 T 可以打印值的类型 还有什么 动词 格式列表可在fmt 包的文档 http golang org pkg fmt General v the value in a de
  • 如何在.net6中使用WebApplicationFactory(没有可讲的入口点)

    在 ASP NET Core 6 中 默认模板将所有内容从Startup cs into Program cs 并使用 Program cs 中的顶级语句 因此不再有 可以说的 Program乙醚类 这看起来很棒 但现在 我需要测试所有这些
  • 在快速解析 Json 时无法将“NSNull”类型的值转换为“NSString”

    我有以下课程 class BannerResponse NSObject let URL Url let CONTACT NO ContactNo let IMAGE Image let BIG IMAGE BigImage let ID
  • 为什么 Evan 的调试器说我要转向 eax 而不是 rax?

    我正在将一些值移至 rax 但调试器显示它正在移至 eax 这是怎么回事 是用调试器 nasm 还是我的知识 无论如何 代码当然可以完美运行 我使用的调试器是 Evan s Debugger 简而言之 您和调试器都是正确的 当您将某物移动到
  • C++ 风格与性能?

    C 风格与性能 使用 C 风格的东西 比某些 C 等价物更快 这是不好的做法吗 例如 不要使用atoi itoa atol ETC 使用std stringstream 永远不要使用原始指针 而是使用智能指针 好吧 它们真的很有用 每个人都
  • QMediaplayer 无法在无框和半透明背景 PyQt5 上工作

    我正在使用 QMediaplayer 制作视频播放器 但它无法在无框和半透明背景窗口上工作 我想制作圆角窗口 所以我需要无框和半透明窗口 这是我的代码 from PyQt5 QtCore import Qt QUrl from PyQt5
  • Node.js 将图像通过管道传输到内存中并显示它

    我正在制作一个下载和显示图像的 Node js Electron 应用程序 我正在使用请求从互联网下载图像 我想将此图像保存在内存中并显示它 而不将文件保存在本地硬盘上 我知道我可以通过插入来完成我在这里提出的要求 img src url
  • 为什么初始化程序不能处理返回 list 的属性?

    找不到这个问题的答案 这一定是显而易见的 但仍然如此 我尝试在这个简化的示例中使用初始化程序 MyNode newNode new MyNode NodeName newNode Children Add smth mistake is h
  • 以串行对象作为参数的多进程

    我在使用 Python 并将串行对象作为参数传递给单独的进程时遇到问题 该程序在 Windows 8 中运行 因此不能选择使用全局变量 from multiprocessing import Queue from multiprocessi
  • 如何隐藏AG-Grid中的列?

    如何隐藏 AG Grid 中的列 并且它不应显示在工具面板中 var columnDefs headerName Stone ID field Stone ID width 100 hide true 您可以设置列属性抑制工具面板 http
  • 强制 VSProps 设置覆盖项目设置

    我有一个 vsprops 文件 它定义了针对 Visual Studio 2008 构建所有项目时应使用的优化 如果我将项目的属性设置为 从项目默认值的父级继承 它将起作用 并将它们填充到 vcproj 文件中 但是 这并不能保护我免受开发
  • R - 复制组内的值

    我有一个数据框 其中有某人在过去 3 年 2016 年 2017 年 2018 年 中获得的总分 还有他们每年的得分列 我的数据框如下所示 myDF lt data frame ID c 1 1 1 2 2 3 4 Dates c 2016
  • Rails 3 无效多字节字符 (US-ASCII)

    我发现了一个类似的帖子here https stackoverflow com questions 1739836 invalid multibyte char us ascii with ruby on rails但无论如何我都无法解决问
  • 斐波那契搜索

    有人请解释一下斐波那契搜索算法 我尝试了很多资源并进行了很多搜索 但算法仍然不清楚 大多数资源都在与二分搜索的链接中描述了它 但我不明白它们 我知道斐波那契搜索算法是二分搜索的扩展 我对此非常了解 我的书也未能解释 我知道斐波那契数定义为
  • 我们可以在MySql中为UPPERCASE和LOWERCASE函数创建函数索引吗

    我们可以在MySql中创建功能索引吗UPPERCASE and LOWERCASE功能 我已经搜索过 但在互联网上找不到任何相关的内容 如果有人实现了这样的事情 是的 添加了 MySQL 8 0 13索引表达式 https dev mysq
  • 带有左连接的 LINQ 和枚举

    我有一个枚举 public enum Status New InProgress Processed InComplete 我有以下查询要查询 以根据状态提供列表计数 但现在我只知道它是否存在 因此 如果已处理计数为零 我将不会获得任何值
  • Python从图中获取所有路径

    我正在尝试找到用户可以通过网站访问的路径 我使用以下格式表示我的图表 graph 0 1 2 1 3 6 0 2 4 5 0 3 1 4 6 2 5 6 2 6 1 4 5 我已经实现了深度优先算法 但需要对其进行更改才能发挥作用 它需要返
  • Python-关于操作系统上的文件句柄限制

    嗨 我用 python 编写了一个程序 当我打开太多临时文件时 我会得到一个异常 Too much open files 然后我发现 Windows 操作系统或 C 运行时具有文件句柄限制 因此 我使用 StringIO 更改我的程序 但仍
  • APP_INITIALIZER 之后服务实例化两次

    问题是 我需要进行 http 调用并存储生成动态路由所需的对象 所以 我利用了 APP INITIALIZER app module ts import ApplicationService from application service