首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular中连续异步函数的问题

Angular中连续异步函数的问题
EN

Stack Overflow用户
提问于 2019-07-16 23:48:18
回答 2查看 75关注 0票数 0

getEnrolledPlayers应该从数据库中获取一个“player”对象数组,然后将其传递给matchMaking函数。然而,它没有被正确地传递。

我试着添加可观察数据,处理订阅

代码语言:javascript
复制
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()函数。我认为这是因为异步运行时。

EN

回答 2

Stack Overflow用户

发布于 2019-07-16 23:56:45

是。这肯定是由于内部subscription解析某个值的时间差而导致的问题。

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

试一试:

代码语言:javascript
复制
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));
    });
}

或使用一个subscribe

代码语言:javascript
复制
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();
}
票数 3
EN

Stack Overflow用户

发布于 2019-07-17 05:03:30

这是一个嵌套的订阅反模式...你永远不要嵌套订阅,这是使用高阶运算符应该是什么样子的:

代码语言:javascript
复制
initializeEvent(eventId: string) {
  this.getEnrolledPlayers(eventId)
    .pipe(
      switchMap(playerIds => 
         forkJoin(playerIds.map(playerId => this.dataService.fetchSinglePlayer(playerId)))
      )
    ).subscribe((enrolledPlayers) => 
      this.matchMaking(enrolledPlayers)
    );
}

使用switchMap切换到一个新的观察值,然后使用forkJoin并行运行多个观察值

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57061109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档