Является ли вызов функции ngOnInit асинхронным?

Если я вызываю функцию в ngOnInit(), которая делает наблюдаемый вызов для получения данных, вызов this.getSomething() в ngOnInit остается асинхронным или ngOnInit ждет, пока this.getSomething() вернет результат? В основном выполняется ли «doSomethingElse» в ngOnInit() до или после завершения this.getSomething()?

ngOnInit() {
    this.getSomething();
    doSomethingElse;
}

getSomething() {
    this.someService.getData()
        .subscribe(
            result => {
                this.result = result;
            },
    error => this.errorMessage = <any>error);
}

person Felix    schedule 14.09.2016    source источник


Ответы (1)


ngOnInit() сам по себе не ждет асинхронных вызовов. Вы можете самостоятельно закодировать цепочку так, чтобы она выполнялась только после завершения асинхронного вызова.

Например, то, что вы помещаете внутрь subscribe(...), выполняется при поступлении данных.

Код, следующий за subscribe(...), выполняется немедленно (до завершения асинхронного вызова).

Есть некоторые хуки жизненного цикла маршрутизатора, которые ждут возвращенных промисов или наблюдаемых объектов, но ни один из хуков жизненного цикла компонентов или директив этого не делает.

обновить

Чтобы код после this.getSomething() выполнялся при завершении getData(), измените код на

ngOnInit() {
    this.getSomething()
    .subscribe(result => {
      // code to execute after the response arrived comes here
    });
}

getSomething() {
    return this.someService.getData() // add `return`
        .map( // change to `map`
            result => {
                this.result = result;
            },
  //  error => this.errorMessage = <any>error); // doesn't work with `map` 
  // (could be added to `catch(...)`
}
person Günter Zöchbauer    schedule 14.09.2016
comment
Спасибо Гюнтер. Но если у меня есть код после вызова this.getSomething() в ngOnInit, выполняется ли этот код ПОСЛЕ завершения кода в getSomething()? - person Felix; 14.09.2016
comment
Нет, он (вероятно) будет выполнен до завершения вызова http в getSomething. - person rinukkusu; 14.09.2016
comment
Спасибо, ребята, это помогло. Я немного обновил вопрос, чтобы уточнить, и добавил строку doSomethingElse в ngOnInit. По сути, как упомянул @rinukkusu, мне любопытно точно знать, может ли doSomethingElse выполняться до завершения doSomething() (предположим, что doSomethingElse не связан с данными, полученными из getSomething()), поэтому приложение не ждет службы позвоните, чтобы закончить. - person Felix; 14.09.2016
comment
getSomething() вызывается, this.someService.getData() вызывается (но возвращается немедленно, getSomething() возвращается, doSomethingElse() выполняется, ngOnInit() возвращается. Затем, в конце концов, приходит ответ сервера и выполняется result => { this.result = result} (вы можете видеть, что вы передаете subscribe, например, регистрируя обработчик события). - person Günter Zöchbauer; 14.09.2016