我知道应该避免嵌套订阅并应该使用 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()之类的方法来更改为其他调用,而不是按原样保留原始订阅。
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)
| 归档时间: |
|
| 查看次数: |
1544 次 |
| 最近记录: |