Rx js запретить подписку при подписке - PullRequest
0 голосов
/ 02 марта 2020

У меня есть массив объектов. Мне нужно получить массив, если идентификаторы, затем вызвать 2 API, а затем закрыть модальное окно.

Мой код:

from(this.alerts)
      .pipe(map(alert => alert._id))
      .subscribe(alertIds => zip(
          this.alertApi.someCall1(alertIds, ...),
          this.alertApi.someCall2(alertIds, ...),
        ).subscribe(() => {
          this.activeModal.close();
        }),
      );

Есть ли у вас какие-либо идеи по предотвращению subscribe внутри subscribe

Ответы [ 2 ]

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

Вы можете использовать forkJoin, что аналогично Promise.all, и switchMap.

См. Также: документы Rx JS, в частности пример 6, который аналогичен ваша ситуация.

from(this.alerts)
    .pipe(
        switchMap(alert =>
            forkJoin(
                this.alertApi.someCall1(alert._id),
                this.alertApi.someCall2(alert._id)
            )
        )
    )
).subscribe(() => {
   this.activeModal.close(); 
});

Обратите внимание, что полученная наблюдаемая будет излучаться только тогда, когда все внутренние наблюдаемые завершены.

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

Используйте оператор switchMap rx js, чтобы избежать вложенных подписок.

from(this.alerts)
      .pipe(
         map(alert => alert._id),
         switchMap(alertIds => zip(
           this.alertApi.someCall1(alertIds, ...),
           this.alertApi.someCall2(alertIds, ...)
         ))
      )
      .subscribe(() => {
          this.activeModal.close();
      );

Более подробную информацию об операторе switchMap можно найти здесь .

...