APP_INITIALIZER не работает в библиотеке angular6 - PullRequest
0 голосов
/ 17 сентября 2018

Я создаю библиотечный вызов angular6 mapModule и импортируюсь в модуль приложения, теперь я хочу сделать что-то перед загрузкой mapModule, поэтому я пытаюсь добавить APP_INITIALIZER в эту библиотеку:

export function StartupServiceFactory2(mapConfigService: MapConfigService) {
    const x = 2 + 2; 
    console.log(x);
    return () => mapConfigService.readConfig();
}

но это не работает

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Я тоже наткнулся на это, где APP_INITIALIZER не будет полностью инициализировать приложение перед запуском CanActivate охранника маршрута.

Несколько вещей, которые нужно посмотреть:

  1. mapConfigService должен вернуть Promise
  2. При преобразовании Observable в обещание через toPromise() и последующем вызове .then() - обещание освобождается до подключения к .then():

Это будет иметь проблему:

let promise = this.mapConfigService.map(...).toPromise().then(()=>{
 ///  this part of the code will NOT block the APP_INITIALIZER
 ///  meaning when toPromise() is called the promise is released 
 ///  right away before having a chance to fully execute the .then() part
       ....
});

Вместо этого оберните Observable в Promise и попросите resolve() выпустить обещание, как показано ниже:

readConfig(): Promise<any> {                                    
    const promise = new Promise((resolve, reject) => {                                    
            this.mapConfigService.subscribe((data)=> {
                // additional stuff

                resolve();
                return data;                
    });

    return promise;
}   

Надеюсь, это поможет.

0 голосов
/ 17 сентября 2018

Вы предоставляете это?

// app.module
providers: [
  { provide: APP_INITIALIZER,
   useFactory: StartupServiceFactory2,
   deps: [MapConfigService], multi: true }
]

Возвращает ли mapConfigService.readConfig () Promise?

Взгляните на пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...