RxJS中switchMap处理observable对象内数组请求时类型错误如何解决?
问题修复方案
核心错误原因
- 第一个
switchMap回调中用forEach发起异步请求完全无效:forEach不会消费回调返回的Observable,所有getFiles请求从未被触发执行 - 分支逻辑没有覆盖全场景:当
tInfo.documents不存在时,回调没有返回值,导致类型为void和要求的ObservableInput不匹配,触发你看到的报错:
参数类型'(tInfo: { documents; documentsInfo: any[]; }) => void'无法赋值给类型'(value: { documents: any; documentsInfo: any[]; }, index: number) => ObservableInput',类型'void'无法赋值给'ObservableInput'类型
- 代码存在多处拼写/变量引用错误:
tInfo..documents多了多余的点、未定义变量taxInfo引用错误
修复思路
用forkJoin操作符包裹所有文档查询请求,等所有请求执行完成、把文档信息挂载到tInfo后,再统一返回tInfo对象,同时补全所有分支的返回逻辑,避免空返回。
完整修复代码
// 先导入依赖的操作符 import { forkJoin, of } from 'rxjs'; import { switchMap, map } from 'rxjs/operators'; public transform(tId: any,name: string, args?: any): Observable<string> { return this.sService.getTaxById(tId).pipe( switchMap((tInfo:{ documents: any[]; documentsInfo: any [] }) => { // 没有文档的场景直接返回原对象 if (!tInfo.documents || tInfo.documents.length === 0) { return of(tInfo); } // 组装所有文档查询请求 const docRequests = tInfo.documents.map(doc => { return this.sService.getFiles(doc.docId).pipe( map((filesInfo: { FileName: string; downloadUrl: string }) => { return { docName: filesInfo.FileName, downloadUrl: filesInfo.downloadUrl, } }) ) }); // 等所有请求完成后把数据挂载到tInfo上再返回 return forkJoin(docRequests).pipe( map(fileList => { tInfo.documentsInfo = fileList; return tInfo; }) ) }), switchMap((Info: { cc: string; authority: boolean; cName: string}) => { // 没有权限的场景直接返回原对象 if (!Info.authority) { return of(Info); } // 修正变量引用错误:原来的taxInfo未定义,改为Info.cc const cc = Info.cc; return this.sService.getOrgs(cc).pipe( map((orgsData: any[]) => { console.log("Data============>", orgsData); (orgsData || []).forEach(tax => { // 修正逻辑错误:原判断逻辑永远不会成立,改为遍历每个tax判断匹配 if (Info.authority === tax.id) { Info.cName = tax.parentName; } }); return Info; }) ); }), map((Info) => { if (name === 'subsTemplate') { return this.subsTemplate(Info); } // 补全分支返回,避免返回undefined return ''; }) ); }
内容的提问来源于stack exchange,提问作者Gaurav Matta
相关产品推荐
相关产品推荐

