Проблема наблюдаемого и обещанного подхода - PullRequest
0 голосов
/ 13 июля 2020

В моем приложении Ionic / Angular я конвертирую некоторые обещанные реализации для использования вместо них наблюдаемых. У меня возникла одна проблема с конкретной функцией. Мой исходный (рабочий, основанный на обещаниях) код выглядел так:

  async getPlayerStats() {
    this.user = await this.mainService.getPlayerStats(this.username);
    this.checkRookieTopicCompletionStatus();
  }

Как вы можете видеть, с вышеупомянутой имплантацией я жду this.user, прежде чем позвонить this.checkRookieTopicCompletionStatus(); Это важно, потому что я использую this.user в for-loop в этой функции.

Теперь, в моей новой реализации на основе наблюдаемых, моя функция getPlayerStats() выглядит так:

  getPlayerStats() {
    this.mainService.getPlayerStats(this.username).subscribe(
      user => this.user = user,
      error => this.errorMsg = error,
    );
    this.checkRookieTopicCompletionStatus();
  }

Проблема в том, что this.checkRookieTopicCompletionStatus() срабатывает до того, как доступно this.user. Итак, мой вопрос: как мне изменить эту функцию выше, чтобы я был уверен, что у меня есть this.user данные до вызова this.checkRookieTopicCompletionStatus()? Могу ли я вызвать его откуда-то из блока subscribe()?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Предполагая, что this.mainService.getPlayerStats(this.username) возвращает наблюдаемый объект, вам необходимо включить все операторы, напрямую зависящие от этого наблюдаемого объекта, в подписку. Попробуйте следующее

getPlayerStats() {
  this.mainService.getPlayerStats(this.username).subscribe(
    user => { 
      this.user = user;            // <-- this is assigned asynchronously
      this.checkRookieTopicCompletionStatus();
    },
    error => this.errorMsg = error,
  );
}
0 голосов
/ 13 июля 2020

Могу ли я вызвать его откуда-то из блока subscribe ()?

Да, вот так.

getPlayerStats() {
  this.mainService.getPlayerStats(this.username).subscribe(
    user => {
         this.user = user;
         this.checkRookieTopicCompletionStatus();
      }
    error => this.errorMsg = error,
  );
}
...