Observable 与 Promised-based 方法中的问题

Issue in Observable vs Promised-based Approach

在我的 Ionic/Angular 应用程序中,我将一些基于承诺的实现转换为使用可观察对象。我 运行 遇到了一个特定功能的问题。我的原始(工作的,基于承诺的)代码如下所示:

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

如您所见,通过上述植入,我在调用 this.checkRookieTopicCompletionStatus(); 之前等待 this.user 这很重要,因为我在该函数的 for-loop 中使用了 this.user .

现在,在我新的基于 observable 的实现中,我的 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() 块中的某个地方调用它吗?

假设 this.mainService.getPlayerStats(this.username) returns 一个可观察对象,您需要在订阅中包含直接依赖于此可观察对象的所有语句。尝试以下

getPlayerStats() {
  this.mainService.getPlayerStats(this.username).subscribe(
    user => { 
      this.user = user;            // <-- this is assigned asynchronously
      this.checkRookieTopicCompletionStatus();
    },
    error => this.errorMsg = error,
  );
}

Do I call it from somewhere within the subscribe() block?

是的,就像这样。

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