为什么嵌套订阅不好?

时间:2019-11-11 07:22:38

标签: angular rxjs

我知道应该避免使用嵌套订阅,而应该使用rxjs运算符,但是我发现的有关此问题的文章通常只是说嵌套订阅是不好的,没有说明原因(除了说“可能引起问题”)。

我想知道是否有人可以为此提供帮助?谢谢。

2 个答案:

答案 0 :(得分:1)

let sub1, sub2, sub3, sub4;
sub1 = service.call1().subscribe(result1 => {
  sub2 = service.call2(result1).subscribe(result2 => {
    sub3 = service.call3(result2).subscribe(result3 => {
      sub4 = service.call4(result3).subscribe(result4 => {
        // Do stuff with result 4
      });
    });
  });
});

vs

let sub = service.call1().pipe(
  switchMap(result1 => service.call2(result1)),
  switchMap(result2 => service.call3(result2)),
  switchMap(result3 => service.call4(result3)),
  switchMap(result4 => service.call5(result4))
)

答案 1 :(得分:1)

好,您要问,因为这是一个常见问题。

考虑类似

service.cal1().subscribe(val => {
  service.call2(val).subscribe( res => {
    *does things*
  }
}

对于call1()的Observable发出的每个值,您要触发的是一个新的Subscription(因此有一个新的执行管道)。 这会给您留下数百个未处理的Observables和Subscriptions,这些Subscriptions会暂时保留在内存中。

您需要知道,当您多次subscribe()观看一次Observable时,您的订阅者将不会收听完全相同的来源,而是会触发您定义的Observable管道的新副本。

Observable Docu

中第一个示例所述
  

可观察到的值,立即(同步)推送值1、2、3 订阅时

强调我的想法

Observable本身不执行任何操作,而是订阅后开始其整个旅程

这就是为什么您尝试使用类似switchMap()之类的内容来切换到另一个呼叫,而不是保留原始订阅的原因。