为什么嵌套订阅不好?

dmd*_*dmd 5 rxjs angular

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

我想知道是否有人可以帮助解决这个问题?谢谢你。

小智 8

很高兴您提出这个问题,因为这是一个常见问题。

考虑类似的事情

service.cal1().subscribe(val => {
  service.call2(val).subscribe( res => {
    *does things*
  }
}
Run Code Online (Sandbox Code Playgroud)

您触发的是一个新的订阅(因此是一个新的执行管道),用于由 Observable 发出的每个值call1()。这可能会给您留下数百个未处理的 Observables 和 Subscriptions,它们都暂时保留在内存中。

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

正如Observable Docu中的第一个示例所述

订阅后立即(同步)推送值 1、2、3 的 Observable

强调我的

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

这就是为什么您会尝试使用诸如switchMap()之类的方法来更改为其他调用,而不是按原样保留原始订阅。


Adr*_*and 5

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
      });
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

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))
)
Run Code Online (Sandbox Code Playgroud)