如何将Observable<Observable<Organization>[]>转换为Observable<Organization[]>?
解决方案:RxJS操作符处理Observable数组转换
我来帮你搞定这两个在NgRx场景下的RxJS转换问题,这其实是日常处理嵌套Observable时很常见的需求:
1. 把Observable<Organization>[]转换为Organization[]
你需要用到forkJoin这个RxJS操作符——它专门用来处理Observable数组:当数组里所有的Observable都完成并返回各自的值后,它会把这些值打包成一个普通的Organization[]数组返回,刚好匹配你action的payload类型要求。
2. 把Observable<Observable<Organization>[]>转换为Observable<Organization[]>
这是嵌套Observable的场景,外层是一个Observable,里面包裹着Observable数组。我们可以先用switchMap(或者concatMap/mergeMap,根据业务需求选)把外层Observable拆解开,再用forkJoin处理内层的Observable数组,最终得到Observable<Organization[]>类型的结果。
调整你的NgRx代码
把原来的.map()替换成switchMap + forkJoin的组合,就能完美适配GetOrganizationSuccess的payload要求了:
// 假设上游流是Observable<Observable<Organization>[]>类型 .switchMap((obsArray: Observable<Organization>[]) => { // 用forkJoin将Observable数组转换为Organization[]的Observable return forkJoin(obsArray); }) .map((orgs: Organization[]) => { // 此时orgs就是符合要求的Organization[]类型,直接传给action即可 return new usersActions.GetOrganizationSuccess(orgs); })
如果想更简洁,还可以写成链式简写:
.switchMap(forkJoin) .map(orgs => new usersActions.GetOrganizationSuccess(orgs))
小补充:操作符选择
switchMap:如果上游Observable会频繁发射新值,它会取消之前未完成的请求,适合需要响应最新数据的场景;concatMap:会按顺序处理每个上游值,必须等前一个处理完成才会处理下一个,适合需要保证执行顺序的场景;mergeMap:会同时处理所有上游值,适合不需要严格顺序、可以并发处理的场景。
根据你的业务逻辑选对应的操作符就好啦。
内容的提问来源于stack exchange,提问作者Mohamed Abo Elmagd
相关产品推荐
相关产品推荐

