Как выполнять несколько вызовов API параллельно и обрабатывать ответы по мере их поступления в службу HTTP в Angular?

У меня есть служба HTTP, которая получает ответы, которые необходимо использовать нескольким другим API. Я хочу выполнять эти вызовы API параллельно. Кроме того, я не хочу ждать завершения выполнения всех API; вместо этого я хочу обрабатывать каждый ответ API сразу после его получения.

Вот чего я пытаюсь достичь:

  1. Моя основная служба HTTP получает ответ.
  2. Этот ответ необходимо передать нескольким другим API.
  3. Эти API следует вызывать параллельно.
  4. Как только один 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?

JustAnotherDeveloper 05.05.2024 15:30
forkJoin тоже ждёт завершения всего.
Navitas28 05.05.2024 15:35

Ой. Да, я совершенно неправильно это прочитал. Learnrxjs.io/learn-rxjs/operators/combination/zip, тогда?

JustAnotherDeveloper 05.05.2024 15:41
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
3
158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте объединить 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!
    }
});

Другие вопросы по теме