Angular 7 — вложенные наблюдаемые

У меня есть маршрут Angular, который использует параметр :client_name, и сервис с методом getClientDetails(client_name) для получения данных из HTTP API на основе :client_name. Оба метода Observable работают сами по себе, но когда я объединяю 2 наблюдаемых, вызов API выполняется до того, как параметры будут получены (имя_клиента не определено):

    this.route.params.subscribe(params => {
  this.client_name = params['client_name'];
  this.dataService.getClientDetails(this.client_name).subscribe(
    clientdata => {
      this.client = clientdata;
      console.info(clientdata);
    });

Как связать обе наблюдаемые, чтобы API запускался только после возврата :client_name?

Хм... значит, метод getClientDetails будет работать, только если params['client_name'] определен?

wentjun 13.06.2019 04:49

@wenjun правильно.

Yann 13.06.2019 04:50

Ok. А что будет, если он не определен? Есть ли какое-то конкретное поведение, которое вы хотите вызвать?

wentjun 13.06.2019 04:52

вы можете посмотреть по этой ссылке: stackoverflow.com/questions/40788163/…

Vimit Dhawan 13.06.2019 04:53

@wentjun Вызов API должен выполняться только после разрешения params['client_name'].

Yann 13.06.2019 05:02
Тестирование функциональных 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
5
539
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Для этого сценария мы можем использовать конвейерные операторы RxJS.

Во-первых, мы можем использовать карта слияния RxJS для отображения наблюдаемых значений из route во внутреннюю наблюдаемую. Если params и params['client_name'] определены, мы присваиваем params['client_name'] свойству client_name, что аналогично вашему исходному коду. Затем мы вызываем метод getClientDetails() из dataService. Если params не существует, мы конвертируем null в наблюдаемую и возвращаем ее.

Впоследствии наблюдаемые возвращаются в блоке .subscribe(). Оттуда мы можем назначить ответ свойству client.

import { mergeMap } from 'rxjs/operators';
import { of } from 'rxjs';
.
.
this.route.params.pipe(
  mergeMap(params => {
    if (params && params['client_name']) {
      this.client_name = params['client_name'];
      return this.dataService.getClientDetails(this.client_name);
    } else {
      return of(null)
    }
  })
).subscribe(response => {
  // handle the rest
  this.client = response;
})

Если я использую следующую, ошибочную и полную структуру, можем ли мы поместить вторую подписку в полный блок, а не mergeMap?

Bigeyes 18.07.2019 13:14

@Bigeyes Хм .. Я бы не рекомендовал вам это делать. Вы можете использовать mergeMap для объединения вложенных операций. Обратный вызов complete следует использовать только для обработки любой логики, касающейся завершения выполнения этого блока кода!

wentjun 18.07.2019 16:20

Отлично. На самом деле у меня есть несколько http-запросов, которые должны быть в порядке. Я слышал о Contact в RxJS, можем ли мы использовать его, чтобы связать их вместе?

Bigeyes 18.07.2019 20:14

@Bigeyes mergeMap и concat оба подойдут. В зависимости от конкретного использования вы можете использовать combineLatest или forkJoin too! Если вам все еще нужна помощь с этим, может быть, вы можете дать мне больше информации о точном использовании?

wentjun 19.07.2019 07:29

Спасибо за хороший ответ. Например, у меня есть два вызова веб-API. Первый http get. Как только я получу возвращенные данные, я хочу сделать второй http post звонок в службу поддержки. Поэтому я хочу связать их вместе.

Bigeyes 20.07.2019 13:52

@Bigeyes Хм .. В этом случае это действительно зависело бы от деталей. Например, если первый запрос API (с http get) возвращает набор данных, и эти данные необходимы для вызова последующего запроса API (http post), вам нужно будет использовать mergeMap()

wentjun 23.07.2019 10:31

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