У меня есть служба HTTP, которая получает ответы, которые необходимо использовать нескольким другим API. Я хочу выполнять эти вызовы API параллельно. Кроме того, я не хочу ждать завершения выполнения всех API; вместо этого я хочу обрабатывать каждый ответ API сразу после его получения.
Вот чего я пытаюсь достичь:
search(metaInfo: Interface1, searchDetails: Interface2) {
return this.http.post<Interface3>(API_ROUTES.history, metaInfo)
.pipe(
switchMap((res) => {
return combineLatest([
this.http.post<any>(API_ROUTES.searchOne, {...searchDetails, requestId: res.requestId}),
this.http.post<any>(API_ROUTES.searchTwo, {...searchDetails, requestId: res.requestId})
])
})
)
}
Есть ли какой-нибудь оператор rxjs
, который можно использовать вместо combineLatest
или forkJoin
, чтобы я мог подписаться на ответы по мере их поступления и не ждать завершения обоих запросов.
P.S.: время выполнения первого API 1 секунда, время выполнения второго API 30-40 секунд, поэтому не могу дождаться завершения выполнения обоих API.
forkJoin
тоже ждёт завершения всего.
Ой. Да, я совершенно неправильно это прочитал. Learnrxjs.io/learn-rxjs/operators/combination/zip, тогда?
Попробуйте объединить rxjs
Оператор слияния — это ваше решение, когда у вас есть несколько наблюдаемых, которые производят значения независимо, и вы хотите объединить их выходные данные в один поток. Думайте об этом как о слиянии автомагистралей, когда несколько дорог объединяются, образуя одну единую дорогу - трафик (данные) с каждой дороги (наблюдаемой) плавно перетекает вместе.
search(metaInfo: Interface1, searchDetails: Interface2) {
return this.http.post<Interface3>(API_ROUTES.history, metaInfo)
.pipe(
switchMap((res) => {
return merge(
this.http.post<any>(API_ROUTES.searchOne, {...searchDetails, requestId: res.requestId}),
this.http.post<any>(API_ROUTES.searchTwo, {...searchDetails, requestId: res.requestId})
)
})
)
}
Одно важное замечание: вам нужно использовать следующий блок подписки, чтобы он выглядел так:
this.search.subscribe({
next: () => {
// processing logic here!
}
});
Пробовали с
forkJoin
?