Angular 在实施延迟加载后取消从 APP_INITIALIZER 发送的 HttpRequest

Angular cancels HttpRequest send from APP_INITIALIZER after implementing Lazy Loading

我正在开发一个 Angular(当前为 v7)应用程序,该应用程序使用 APP_INITIALIZER 检查用户是否已登录。代码非常简单,我添加了 APP_INITIALIZER

@NgModule({
...,
providers: [
  ...,
  {
    provide: APP_INITIALIZER,
    useFactory: CheckLoginFactory,
    deps: [Initialization, AuthService, ObservableState],
    multi: true
  }
]

使用这个工厂:

export function CheckLoginFactory(
  init: any,
  auth: AuthService,
  oss: ObservableState
) {
  const confirmLogin = auth
    .confirmLogin()
    .pipe(catchError(val => of(undefined)));

  return () => confirmLogin.toPromise();
}

confirmLogin-函数检查用户是否登录

confirmLogin(): Observable<User> {
  return this.get('authentication/login').pipe(
    map(response => plainToClass(User, response as Object))
  );
}

到目前为止很简单,这段代码在去年一直有效。现在我重组了应用程序并为应用程序的所有子页面实现了延迟加载,现在这段代码不再起作用了。从 confirmLogin 发送的 http 请求总是在开发工具中显示为 canceled 并且工厂运行到 .pipe(catchError(val => of(undefined)));.

在使用/不使用延迟加载的应用程序中,Angular 如何处理 APP_INITIALIZER 有什么不同吗?

你在延迟加载模块吗?如果是这样,您必须确保在每个模块中提供初始化程序。这个问题很好地回答了这个问题。

Angular Does APP_INITIALIZER work inside of lazy loaded modules

我通过清理代码设法解决了这个问题。我仍然不清楚,是什么修复了它。显然,一些额外的依赖项破坏了代码……所以我所做的就是将提供程序部分中的 APP_INITIALIZER 部分清理为只有一个依赖项:

{
  provide: APP_INITIALIZER,
  useFactory: CheckLoginFactory,
  deps: [AuthService],
  multi: true
}

Angular 显然自动知道 AuthService 有哪些子依赖项,因此不需要在这里再次明确指定它们。