Me enfrento a un problema al encadenar observables en la tubería de transformación. Tengo información bancaria con número de cuenta que está encriptada. Quiero descifrar ese número de cuenta y mostrar.
En la consola, muestra el número de cuenta descifrado, pero solo muestra uno encriptado. por favor ayuda
public transform(bankId: any, name: string, args?: any): Observable<string> { return this.supService.getBankById(bankId).pipe( switchMap( (bInfo: { data: { bankInfo: { accno; }; }; }) => { if (bInfo.data.bankInfo.accno) { const encodedAccountNumber = bInfo.data.partyBankInfo.accountNumber; this.supService.unProtectBank(encodedAccountNumber).subscribe( (data: any) => { console.log("Unencrypted data======>", data); bInfo.data.bankInfo.accno = data; }); } return of(bInfo); }), map( (info: { data: { bankInfo: { accno; }; }; }) => { console.log("Bank Info==============>", bankInfo); if (name === 'accountNumber') { return info.data.bankInfo.accno; } } ) ); }Su primera operación switchMap devuelve of(bInfo) inmediatamente sin ninguna posibilidad de que su llamada interna finalice y actualice el valor.
Lo que debe hacer es reemplazar el contenido de su switchMap con:
if (bInfo.data.bankInfo.accno) { const encodedAccountNumber = bInfo.data.partyBankInfo.accountNumber; // Do not subscribe here return this.supService.unProtectBank(encodedAccountNumber).pipe( map((data: any) => { console.log("Unencrypted data======>", data); bInfo.data.partyBankInfo.accountNumber = data; // Return something out of the Observable return bInfo; }) ); } else { return of(bInfo); } La clave aquí son las declaraciones de return y la eliminación de subscribe a favor de pipe .
devuelva el Observable upProtectedBank y use el operador tap en lugar de subscribe .
switchMap( (bInfo: { data: { bankInfo: { accno; }; }; }) => { if (bInfo.data.bankInfo.accno) { const encodedAccountNumber = bInfo.data.partyBankInfo.accountNumber; return this.supService.unProtectBank(encodedAccountNumber).pipe( map((data: any) => { console.log("Unencrypted data======>", data); bInfo.data.bankInfo.accno = data; return bInfo; })); } return of(bInfo); }),