javascript - Angular中连续异步函数的问题
问题描述
getEnrolledPlayers 应该从数据库中获取一个“玩家”对象数组,然后将其传递给 matchMaking 函数。但是,它没有正确通过。
我尝试添加 observables,玩转订阅
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);
});
}
当我调用这一系列异步函数时,注册播放器 [] 被正确计算(7 个元素的数组),但它没有被正确调用到 matchMaking() 函数。我认为这是因为异步运行时。
解决方案
是的。subscription
这绝对是由于内部解析值的时间差异引起的问题。
我建议forkJoin
在调用之前使用 a 并等待解决所有值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));
});
}
或与一个subscribe
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();
}
推荐阅读
- java - 有没有办法使用 apache nifi 中的处理器从 json 字段中提取值并将该值替换为另一个 json 文件?
- python-3.x - 如何从列表中创建一个新字典,使用位置来指示键和值?
- php - 如何使社交媒体共享按钮共享页面的自定义结果?
- sql - 如何从 sum = @Number 的每一行中的一个未知列中选择一个结果
- raspberry-pi - 如何使用树莓派刺激物联网设备流量
- javascript - Reference JSON variable with string acquired from other JSON
- apache-kafka - 如何使用@KafkaListner 注解订阅多个主题
- geopandas - 在 Pyviz/hvplot 中显示 POINT 数据的悬停信息
- excel - 当 S3 发生更改时更新 Excel 中的行
- azure - ARM模板将字符串数组转换为对象数组