RxJS forkJoin嵌套Observable未解析,如何返回带水果ID的结果数组?
核心问题答复
完全可以实现你需要的「对象数组,每个对象携带对应水果id、带解析后的状态值」的结构,但需要调整Observable的组织方式,不能在普通对象里嵌套未被forkJoin监听的异步流。
原代码的问题根因
当前实现未达到预期,核心原因有三点:
- 调用
of()生成Observable时,直接把isFruitGood()返回的异步Observable当成了普通对象属性值,没有把这个异步流接入forkJoin的监听逻辑 - forkJoin只会解析直接传入它的Observable数组,不会自动展开每个Observable内部嵌套的其他异步流,因此最终拿到的
data字段始终是未订阅的Observable实例,而非解析后的布尔值 - 原代码存在两处会导致运行报错的笔误:多写了一个右括号、把
fruit.id错写为fruid.id
实现核心思路
要拿到每个水果对应的解析结果+绑定的id,需要保证传入forkJoin的每个Observable直接对应单个水果的异步查询任务,不要在普通对象里嵌套未展开的Observable。
正确实现代码
import { forkJoin, map } from 'rxjs'; // 遍历水果数组,为每个水果生成独立的异步查询流 const fruitTasks = fruitArray.map(fruit => { return isFruitGood(fruit.id).pipe( // 在流内部把异步返回的布尔值和对应水果id拼接为目标结构 map(goodResult => ({ data: goodResult, id: fruit.id })) ) }) forkJoin(fruitTasks).subscribe(result => { // 这里拿到的就是每个带id、带解析后布尔值的普通对象数组 console.log(result) })
效果说明
- 传入forkJoin的所有流都没有嵌套结构,forkJoin可以正常等待所有流返回最终值
- 每个流在内部完成了结果拼接,最终订阅拿到的数组元素结构与需求完全一致,不存在未解析的Observable
内容的提问来源于stack exchange,提问作者Trevor Lane
相关产品推荐
相关产品推荐

