Построение сложного взаимосвязанного запроса с RxJS - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть запрос, который должен идти первым.Он создает начальную строку в БД, которая используется для соединения следующих строк, которые я хочу сохранить в других таблицах, с исходной (отношение один ко многим).Поэтому я написал запрос, который использует switchMap для выполнения следующих запросов.

Однако теперь мне нужно повторить этот процесс с другой картой, которая также подключена к исходной и имеет собственных потомков.

Это выглядит так

Main card // has id
-> card details 1   // uses main card id to connect
-> card details 2   // uses main card id to connect
--> sub card        // uses main card id to connect AND has subCardId
   -> sub details 1 // uses subCardId to connect

Итак, я написал это

this.myService.send(...).pipe(
  map(resp => resp.id),
  switchMap(cardId => {
    return forkJoin([
      this.myService.sendQueue(...), // returns a "concat"
      this.myService.send(...).pipe( // here I try to save my subCard
        map(subResp => subResp.id)
        switchMap(subId => {         // and save subOptions to this
          return this.myService.sendQeue(...)
        })
      )
    ]);
  }
).subscribe(resp => console.log(resp))

Итак, я вижу в Сети, что это отправляет запросы:

1) сохранить основную карту

2) сохранить параметры карты

3) сохранить вспомогательную карту

Однако нет запросов от внутренних switchMap


Обновление # 1

Оказалось, что даже если sendQueue возвращает concat-наблюдаемый (который обычно подписывается на все наблюдаемые один за другим), он делает только один вызов APIвместо вызова для каждого переданного элемента.Между тем, если я выполню ту же операцию без этой сложной логики, все будет работать как положено (предполагая одинаковый набор аргументов в обоих случаях).

На всякий случай это поможет

public sendQueue(list: any[]) {
    const observables = list.map(({request, transferData}) => this.send(request, transferData));

    return concat(...observables);
}

Обновление # 2

Я изменил forkJoin на concat, что решило проблему с тем, что не каждый запрос выполнялся.Однако я хотел бы запустить их параллельно, поскольку они независимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...