RxJS阻止订阅中的订阅

时间:2020-03-02 16:22:12

标签: javascript angular rxjs rxjs6 subscribe

我有一个对象数组。我需要获取包含id的数组,然后调用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 个答案:

答案 0 :(得分:1)

使用switchMap rxjs运算符来避免嵌套订阅。

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

有关here的详细信息,请参见{{3}}。

答案 1 :(得分:1)

您可以使用与forkJoinPromise.all类似的switchMap

See also: the RxJS docs, specifically example 6, which is similar to your situation.

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

请注意,只有在所有内部可观测值完成后,才会产生结果可观测值。