我知道应该避免使用嵌套订阅,而应该使用rxjs运算符,但是我发现的有关此问题的文章通常只是说嵌套订阅是不好的,没有说明原因(除了说“可能引起问题”)。
我想知道是否有人可以为此提供帮助?谢谢。
答案 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管道的新副本。
可观察到的值,立即(同步)推送值1、2、3 订阅时
强调我的想法
Observable本身不执行任何操作,而是订阅后开始其整个旅程
这就是为什么您尝试使用类似switchMap()之类的内容来切换到另一个呼叫,而不是保留原始订阅的原因。