Rx Js: Как закрыть подписку на вложенный observable.subscribe call - PullRequest
0 голосов
/ 06 марта 2020

В моем Angular приложении:

я выполняю эту процедуру:

mySubjectOne = new Subject();

methodOne(){
    this.subscriptionOne = mySubjectOne.subscribe((response) => {
      this.methodTwo();
    })
}

methodTwo(){
  this.subscriptionTwo = return this.httpClient.post(myurl , mydata).subscribe((response) => {
      myTreatment(); // MY TREATMENT
  })
}

Моя проблема возникает, когда " mySubjectOne " называется methodOne, вызывает methodTwo ,

и подпискаTwo, кажется, клонируется в + 1 каждый раз:

, например, в третий раз вызова: methodOne, кажется что было 4 подписки на два счета

Как я могу закрыть подписку на подписку два сразу после ЛЕЧЕНИЯ и разрешить ее воссоздание в каждом из них

Предложения?

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Вы можете использовать switchMap для достижения именно этого поведения. Обратите внимание, что есть и другие операторы, такие как exhaustMap или mergeMap, которые могут соответствовать вашему желаемому поведению. Читайте о предоставленном источнике.

mySubjectOne = new Subject();

methodOne() {
  this.subscriptionOne = mySubjectOne.pipe(
    switchMap((response) => this.methodTwo()),
  )
    .subscribe((response) => {
      myTreatment();
  });
}

methodTwo() {
  this.subscriptionTwo = return this.httpClient.post(myurl , mydata);
}

Теперь, когда срабатывает mySubjectOne, будет выполняться methodTwo. Как только это будет сделано, myTreatment запустится.

Обратите внимание, что вы должны запустить methodOne только один раз (для инициализации подписки), так как в противном случае подписка может запускаться несколько раз. Поэтому я предлагаю перенести процесс инициализации в ваш конструктор или, может быть, ngOnInit.

1 голос
/ 06 марта 2020

Я считаю, что подписка внутри подписки - плохая идея. Вам лучше использовать SwitchMap для его обработки.

Если вы предпочитаете go по-своему, вы можете использовать TakeUntil , чтобы выдать конец вашей подписки.

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