我们从一开始就需要在我们的应用程序中提供一些服务。因此,我们有一些提供者,在启动时初始化它们。这来自app.module.ts中的app.module.ts部分
providers: [
{ provide: MAT_DATE_LOCALE, useValue: 'en-US' },
{
provide: APP_INITIALIZER,
useFactory: (service: MetaService) => () => service,
deps: [MetaService],
multi: true
}
],这在9-11角很好。但是,在升级到角12,甚至在空白的角12项目中,这似乎破坏了应用程序。
不过,服务是创建的。它正确地使用以下方式记录:
useFactory: (service: MetaService) => () => { console.log(service); return service; },然而,该页返回为空白白色一页。没有呈现组件,也没有路由发生。
CLI上没有错误,浏览器的控制台中没有任何错误,只有一个空白页。当我移除提供程序时,它似乎运行良好。
它们改变了吗,APP_INITIALIZER在角度12中是如何工作的?如何修复或更新代码以使其再次工作?也许在启动时有更好的方法来初始化服务?
发布于 2021-06-02 15:27:35
角改变了它的应用初始化功能,以允许观察和承诺。注入令牌的特性也发生了变化,它期望函数返回一个可以观察到或无效的承诺。因此,到目前为止,您的代码是错误的,因为您返回的是服务,而不是预期的类型之一。但这仍然不能解释出问题出在哪里。
角用于检查每个初始化器的工厂函数是否返回了一个承诺,并将其添加到要使用Promise.all()执行的承诺数组中。现在,它还检查它是否是可观察的,并通过将订阅调用包装在一个承诺中,并将可观察到的完整和错误回调与决心和拒绝承诺回调绑定在一起,从而将其转换为承诺。
如果您有一个名为“订阅服务”的方法,那么这将导致您的服务通过角的https://github.com/angular/angular/blob/3d1c905c9190f467cc6f8b0c3c612cdd203c3f75/packages/core/src/util/lang.ts#L23-L25保护。然后,角将把你的服务视为一个可观察的,并试图将它转换成上述方式的承诺。(如果您有一个然后的方法,那么这也会导致一个问题,尽管考虑到您的代码以前工作过,这是不太可能的)。承诺永远不会解决,这会导致你所描述的行为。
考虑到您共享的代码,我没有其他理由可以想象这会导致这个问题。至少,只需更改工厂定义,这样它就返回了void,您应该会做得很好。
useFactory: (service: MetaService) => () => { }https://stackoverflow.com/questions/67807170
复制相似问题