在转换管道中使用链接的可观察对象

Using chained observables in transform pipe

我在转换管道中链接可观察对象时遇到问题。我有带加密帐号的银行信息。我要解密那个账号显示

在控制台中显示解密的帐号,但只显示加密的帐号。 请帮忙

    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;
          }
        }
      )
    );
  }

您的第一个 switchMap 操作 returns of(bInfo) 立即完成,您的内部调用没有任何机会完成并更新值。

您需要做的是将 switchMap 的内容替换为:

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);
}

这里的关键是 return 声明和删除 subscribe 以支持 pipe

return upProtectedBank 可观察并使用 tap 运算符而不是 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);
      }),