首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >APP_INITIALIZER导致空白页,没有角12中的错误(从版本9到11)。

APP_INITIALIZER导致空白页,没有角12中的错误(从版本9到11)。
EN

Stack Overflow用户
提问于 2021-06-02 14:32:32
回答 1查看 1.3K关注 0票数 2

我们从一开始就需要在我们的应用程序中提供一些服务。因此,我们有一些提供者,在启动时初始化它们。这来自app.module.ts中的app.module.ts部分

代码语言:javascript
运行
复制
providers: [
  { provide: MAT_DATE_LOCALE, useValue: 'en-US' },
  {
    provide: APP_INITIALIZER,
    useFactory: (service: MetaService) => () => service,
    deps: [MetaService],
    multi: true
  }
],

这在9-11角很好。但是,在升级到角12,甚至在空白的角12项目中,这似乎破坏了应用程序。

不过,服务是创建的。它正确地使用以下方式记录:

代码语言:javascript
运行
复制
useFactory: (service: MetaService) => () => { console.log(service); return service; },

然而,该页返回为空白白色一页。没有呈现组件,也没有路由发生。

CLI上没有错误,浏览器的控制台中没有任何错误,只有一个空白页。当我移除提供程序时,它似乎运行良好。

它们改变了吗,APP_INITIALIZER在角度12中是如何工作的?如何修复或更新代码以使其再次工作?也许在启动时有更好的方法来初始化服务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-02 15:27:35

角改变了它的应用初始化功能,以允许观察和承诺。注入令牌的特性也发生了变化,它期望函数返回一个可以观察到或无效的承诺。因此,到目前为止,您的代码是错误的,因为您返回的是服务,而不是预期的类型之一。但这仍然不能解释出问题出在哪里。

角用于检查每个初始化器的工厂函数是否返回了一个承诺,并将其添加到要使用Promise.all()执行的承诺数组中。现在,它还检查它是否是可观察的,并通过将订阅调用包装在一个承诺中,并将可观察到的完整和错误回调与决心和拒绝承诺回调绑定在一起,从而将其转换为承诺。

如果您有一个名为“订阅服务”的方法,那么这将导致您的服务通过角的https://github.com/angular/angular/blob/3d1c905c9190f467cc6f8b0c3c612cdd203c3f75/packages/core/src/util/lang.ts#L23-L25保护。然后,角将把你的服务视为一个可观察的,并试图将它转换成上述方式的承诺。(如果您有一个然后的方法,那么这也会导致一个问题,尽管考虑到您的代码以前工作过,这是不太可能的)。承诺永远不会解决,这会导致你所描述的行为。

考虑到您共享的代码,我没有其他理由可以想象这会导致这个问题。至少,只需更改工厂定义,这样它就返回了void,您应该会做得很好。

代码语言:javascript
运行
复制
useFactory: (service: MetaService) => () => { }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67807170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档