javascript - Angular 中连续异步函数的问题

标签 javascript typescript asynchronous rxjs observable

getEnrolledPlayers 应该从数据库中获取“玩家”对象数组,然后将其传递给 matchMaking 函数。但是,它没有正确通过。

我尝试添加可观察量,尝试订阅

initializeEvent(eventId: string) {
  const enrolledPlayers: PlayerStat[] = [];
  this.getEnrolledPlayers(eventId)
    .subscribe((playerIds: string[]) => {
      for (const playerId of playerIds) {
        this.dataService.fetchSinglePlayer(playerId)
          .subscribe((playerStat: PlayerStat) => enrolledPlayers.push(playerStat));
      }
      this.matchMaking(enrolledPlayers);
    });
}

当我调用这一系列异步函数时,enrolledPlayers[] 被正确计算(7 个元素的数组),但它没有被正确调用到 matchMaking() 函数。我认为这是因为异步运行时。

最佳答案

是的。这绝对是由于内部订阅解析值的时间差而导致的问题。

我建议使用 forkJoin并在调用 matchMaking 之前等待所有值得到解析。

尝试一下:

initializeEvent(eventId: string) {
  const enrolledPlayers: PlayerStat[] = [];
  this.getEnrolledPlayers(eventId)
    .subscribe((playerIds: string[]) => {
      const playerInfos$ = playerIds.map(playerId => this.dataService.fetchSinglePlayer(playerId));
      forkJoin(...playerInfos$)
        .subscribe(enrolledPlayers: PlayerStat[] => this.matchMaking(enrolledPlayers));
    });
}

或者通过一个订阅

initializeEvent(eventId: string) {
  const enrolledPlayers: PlayerStat[] = [];
  this.getEnrolledPlayers(eventId)
    .take(1)
    .switchMap((playerIds: string[]) => {
      const playerInfos$ = playerIds.map(playerId => this.dataService.fetchSinglePlayer(playerId).take(1));
      return forkJoin(...playerInfos$);
    })
   .tap(this.matchMaking)
    .subscribe();
}

关于javascript - Angular 中连续异步函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57061109/

相关文章:

javascript - 如何使用 jQuery 将一个元素移动到另一个元素中

javascript - 从 DOM 获取 .append 值

javascript - 使用 Typescript 从 Angular 2 中的 Observable 获取项目

python - 从python中的异步函数修改全局变量

Django + 执行异步进程?

javascript - 当通过 JS 修改 <div> 背景时,CSS 动画停止工作

javascript - Ajax jqXHR.status==0 修复错误

javascript - Typescript 二维数组定义抛出错误

visual-studio - Visual Studio Online Build 在 TypeScript 上失败

c# - 任务类无法获取正确的值