如何将Observable数组转换为数组的Observable?RxJS代码问题
解决Observable数组转数组的Observable问题
我来帮你搞定这个问题!你当前代码返回Observable<Observable<Item>>的核心原因是操作符使用不当:firstProvider.getIds(uid)返回的是Observable<String[]>(能链式调用操作符说明它是Observable类型,而非直接的数组),你用flatMap(obs$ => obs$)会把数组里的每个id逐个发射出来,再对每个id调用getOneItem(id)返回新的Observable,最终就形成了“Observable里嵌套Observable”的结构。
要实现将所有Observable<Item>合并为一个包含全部Item的Observable<Item[]>,可以用RxJS的forkJoin操作符(最适合你的场景,因为getOneItem应该是单次请求类的Observable,完成后就结束),配合switchMap来切换流,具体代码如下:
修正后的代码
import { forkJoin } from 'rxjs'; import { switchMap } from 'rxjs/operators'; // 简洁写法 this.output = this.firstProvider.getIds(uid).pipe( // 先拿到id数组,再把每个id转成Observable<Item>,最后用forkJoin合并 switchMap(ids => forkJoin(ids.map(id => this.secondProvider.getOneItem(id)))) );
代码解释
switchMap:订阅getIds返回的Observable,当它发射出id数组后,切换到新的流(也就是forkJoin返回的Observable)forkJoin:接收一个Observable数组,等待所有Observable都完成后,将它们的结果收集成一个数组发射出去,最终你得到的就是Observable<Item[]>
额外优化:处理请求失败场景
如果某个getOneItem(id)请求可能失败,你可以给单个Observable添加错误处理,避免整个流被中断:
import { forkJoin, of } from 'rxjs'; import { switchMap, catchError } from 'rxjs/operators'; this.output = this.firstProvider.getIds(uid).pipe( switchMap(ids => forkJoin( ids.map(id => this.secondProvider.getOneItem(id).pipe( // 单个请求失败时返回null,不影响其他请求结果 catchError(() => of(null)) )) )) );
内容的提问来源于stack exchange,提问作者Melchia
相关产品推荐
相关产品推荐

