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