Rx js вызовите другую подписку в pipe и измените переменную с root подписки на angular - PullRequest
0 голосов
/ 04 марта 2020

Используя другую подписку, я хочу установить свойство, которое получается из подписки root.

Итак, у меня есть подписка, подобная этой:

this.repository.getData(`api/cards/list`)
.subscribe(
  res => {
    this.data = res as EmployeeCard[];
  }
);

Моя модель EmployeeCard, подобная этой :

export class EmployeeCard {
    id: number;
    employeeId: number;
    employeeFullName: string;
    companyId: number;
    cardId: number;
    cardNumber: string;
    currentSpendingLimit: string;
    limitResetDate: Date;
    cardUsageStatu: boolean;
    cardActiveDays: string;
    balance:string;
}

Поэтому мне нужно получить balance из другого запроса API. Для этого запроса требуется значение barcode карты. Я могу получить barcode с вызовом другого запроса, который возвращает информацию о карте. Запросом карты должен быть вызов со значением cardId, которое возвращается с моделью EmployeeCard.

Так что моя новая подписка должна выглядеть следующим образом:

this.repository.getData(`api/cards/list`)
.pipe(
    //get card information with cardId (needs another request using EmployeeCard cardId property)
    //get balance using card barcode  (needs another http request with using barcode)
    //set employeecard balance propery
    //return employeecard model's balance to subscription
  )
.subscribe(
  res => {
    this.data = res as EmployeeCard[];
  }
);

Как я могу сделать это с Rx js?

Спасибо

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Вариант использования SwitchMap (возможно, с внутренней картой?)

.pipe(
  switchMap(card => this.getOtherData(card.cardId).pipe(
    map(otherData => ({...card, ...otherData})) // or whatever map function
  )
)
0 голосов
/ 04 марта 2020

Вы должны использовать switchMap с аргументом функции селектора.

function getData() {
  getEmpData()
    .pipe(
      switchMap(
        emp => getBalanlanceInfo(emp.cardId),
        (emp, balanceInfo) => {
          /**
           * Selector function variation of switchMap
           * perform logic with both source and inner observable values
           */
          emp.balance = balanceInfo.balance;
          return emp;
        }
      )
    )
    .subscribe(emp => {
      console.log(emp);
      // Perform your logic here
    });
}

Вы можете найти полный пример здесь в Stackblitz. Больше на switchMap можно найти здесь .

...