transform管道中链式调用Observables时解密账号显示异常问题求助
问题根因
- 你的代码中
unProtectBank是异步接口,你直接对它调用subscribe之后立刻返回了of(bInfo),此时解密请求还没有返回结果,下游map算子拿到的还是原始加密的账号值。你后面控制台能打印出解密后的值是因为异步请求返回后修改了bInfo引用对象的属性,但此时Observable流已经执行完毕,页面已经渲染了原始值,自然不会更新。 - 代码还存在两处笔误:
map算子中打印的bankInfo变量未定义,同时你判断存在性用的是bInfo.data.bankInfo.accno,取加密值又用了bInfo.data.partyBankInfo.accountNumber,要注意字段对应关系避免报错。
修正后代码
public transform(bankId: any, name: string, args?: any): Observable<string> { return this.supService.getBankById(bankId).pipe( switchMap((bInfo: { data: { bankInfo: { accno: string; }; partyBankInfo: { accountNumber: string; } }; }) => { // 先判断是否存在需要解密的账号 const encodedAccountNumber = bInfo.data.partyBankInfo?.accountNumber; if (encodedAccountNumber) { // 把解密接口接入当前流,等解密完成后再往下游传递数据 return this.supService.unProtectBank(encodedAccountNumber).pipe( map((decodedAcc: string) => { bInfo.data.bankInfo.accno = decodedAcc; return bInfo; }) ) } // 无需要解密的内容直接返回原数据 return of(bInfo); }), map((info: { data: { bankInfo: { accno: string; }; }; }) => { console.log("Bank Info==============>", info); if (name === 'accountNumber') { return info.data.bankInfo.accno; } // 补全非账号场景的返回值,避免返回undefined return ''; }) ); }
核心修改点
- 去掉了对
unProtectBank的手动subscribe,把解密请求作为switchMap返回的Observable的一部分,保证解密完成后才会把修改后的bInfo传递给下游map - 补全了类型定义和边界返回值,避免出现undefined异常
- 修正了未定义变量
bankInfo的打印错误
内容的提问来源于stack exchange,提问作者Gaurav Matta
相关产品推荐
相关产品推荐

