2016-10-19 4 views
2

У меня есть меню навигации, в котором используется модуль прокрутки страницы ng2.Угловой 2 - Ожидание булевских истинности перед выполнением службы

Я прокручиваю страницу с помощью хэштага.

Проблема в том, что если я выполняю перекрестную маршрутизацию, данные требуют некоторого времени для загрузки, поэтому служба обычно прокручивается до моего раздела, чем все данные, а часть интереса больше не будет отображаться на экране, поэтому пользователю необходимо выполнить manully прокрутку, чтобы перейти в раздел interst. Это делает все меню бесполезным.

Поэтому я использую EventEmitter во всех разделах, чтобы установить Bools в «прокручивать» страницу, все хорошо ...

Но я не знаю, как ждать allDataLoaded булевых повернуть так.

Я пытался использовать обещание

Это как мой код выглядит так далеко.

HTML компоненты меню навигации

<a [routerLink]="['']" [queryParams]="{ scrollTo: '#home' }"> 
<a [routerLink]="['']" [queryParams]="{ scrollTo: '#contact' }"> 
<a [routerLink]="['']" [queryParams]="{ scrollTo: '#about' }"> 

HTML компонент с помощью корневого сегмента

<componentOne (dataLoadedEvent)="homeLoaded = true; checkIfDataLoaded()"></componentOne> 

TS из компонента с использованием корневого сегмента

homeLoaded: boolean = false; 
contactLoaded: boolean = false; 
aboutLoaded: boolean = false; 

allDataLoaded: boolean = false; 

ngOnInit() { 
    // other code here 
    this.route.queryParams.forEach((params: Params) => { 
     if (params['scrollTo']) { 
      this.checkIfDataLoaded().then(() => { 
       this.scrollToSection(params['scrollTo']); 
      }); 
     } 
    }); 
} 

checkIfDataLoaded() { 
    if (this.homeLoaded && this.contactLoaded && this.aboutLoaded) { 
     //this.allDataLoaded = true; 
     return new Promise((resolve, reject) => { 
      resolve(true); 
     }); 
    } 
} 

Как Гюнтер Zöchbauer ответил здесь (https://stackoverflow.com/a/40126194/3264998) для другого questoin, код сломается с TypeError: Cannot read property 'then' of undefined

TL; DR Что такое правильный способ использовать обещания во время ожидания для BOOL, чтобы превратить истина/ложь?

ответ

2

Проблема заключается в вашем коде, в частности в методе checkIfDataLoaded(), а не потому, что вы работаете с булевыми.

Он явно выдает ошибку, когда внутреннее условие разрешает false, потому что тогда метод возвращает undefined, и поэтому вызов undefined.then(... вызывает ошибку.

Конечно, я не знаю, что именно checkIfDataLoaded() должен делать, но если вы хотите приковать .then() к его результату, то он всегда должен возвращать Promise.

Может быть что-то вдоль этих линий:

checkIfDataLoaded() { 
    return new Promise((resolve, reject) => { 
     if (this.homeLoaded && this.contactLoaded && this.aboutLoaded) { 
      // Whatever logic goes here 
      resolve(true); 
     } else { 
      resolve(false); 
     } 
    }); 
} 

Таким образом checkIfDataLoaded() всегда возвращает Promise в то время как его внутренности могут делать все, что вам нужно.

Смежные вопросы