如何获取RxJs Observable嵌套对象数组的值并等待内部请求resolve?
解决方案
你需要把每个文件对应的importantInfoCall返回的Observable都收集起来,用forkJoin合并后等待所有请求完成,再组装最终的文件对象数组,替换原有的map操作符为switchMap来切换到新的合并Observable即可。
调整后的完整代码
import { forkJoin, switchMap, map } from 'rxjs'; function getData() { return forkJoin([ filesApiRequest, userApiRequest ]) .pipe(switchMap(([files, userInfo]) => { // 把每个文件转换成Observable,等待importantInfoCall返回后组装对象 const fileItemObservables = files.getFilesList() .map((file) => { const name = file.getName(); // 每个文件的独立Observable,拿到异步结果后返回完整对象 return importantInfoCall(userInfo.name, name).pipe( map(importantInfo => ({ data1: file.data1, // 替换为文件对应的原始字段即可 data2: file.data2, name, hasImportantInfo: importantInfo })) ) }); // 等待所有文件的异步请求完成,返回最终的完整数组 return forkJoin(fileItemObservables); })); }
逻辑说明
- 替换原代码中的
map操作符为switchMap:因为我们需要返回一个新的Observable流,而非直接返回同步处理的结果 - 遍历文件列表时,每个文件生成独立的Observable:先执行
importantInfoCall拿到异步返回的结果,再组装成符合要求的完整文件对象 - 用
forkJoin合并所有文件的Observable,等待全部异步请求完成后,一次性返回完整的文件对象数组 - 注意原代码中
userApiRquest存在拼写错误,修正为userApiRequest避免运行报错 - 最终调用
getData()时直接订阅,拿到的就是所有字段都已加载完成的文件数组,不需要额外处理异步逻辑
内容的提问来源于stack exchange,提问作者trebek1
相关产品推荐
相关产品推荐

