我无法理解为什么我的预加载策略已经多次注册和加载,即使模块已经加载了......
来自Angular来源的标准PreloadAllModules
是:
export class PreloadAllModules implements PreloadingStrategy {
preload(route: Route, fn: () => Observable<any>): Observable<any> {
console.log('registering preload', route.path);
function test() {
console.log('preloading', route.path);
return fn();
}
return _catch.call(test(), () => of(null));
}
}
这里,两个console.log只会为我的每个懒惰路由触发一次,如果我在我的懒惰路径中导航,那么它将永远不会重新运行(正常)。
我的自定义策略,我尝试向其添加最小延迟:
export class PreloadAllModulesWithDelay implements PreloadingStrategy {
preload(route: Route, fn: () => Observable<any>): Observable<any> {
console.log('registering preload', route.path);
return timer(5000).pipe(
first(),
map(() => {
console.log('preloading', route.path);
return _catch.call(fn(), () => of(null));
})
);
}
}
首先,将调用registering
日志,然后按照预期调用loading
后5秒。但是在几条路线改变之后,注册/加载将重新运行,就好像角度没有保存模块conf。
尝试调试角度核心源但没有成功。
注意:对于那些想知道的人,我正在创建这个延迟策略,因为角度延迟加载模块太快...它加载它们,而我的路由器动画仍在执行,这导致UI冻结几毫秒(打破我的动画的流动性)..这可能是一个有角度的错误。
答案 0 :(得分:3)
问题是map
正在返回一个新的内部Observable,该角度不知道该怎么做。
您应该使用switchMap
或flatMap
来解决此问题。