Angular自定义/延迟Lazy PreloadingStrategy错误

时间:2018-03-12 10:10:26

标签: angular rxjs lazy-loading

我无法理解为什么我的预加载策略已经多次注册和加载,即使模块已经加载了......

来自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冻结几毫秒(打破我的动画的流动性)..这可能是一个有角度的错误。

1 个答案:

答案 0 :(得分:3)

问题是map正在返回一个新的内部Observable,该角度不知道该怎么做。

您应该使用switchMapflatMap来解决此问题。