rxjs - switchmap 会自动调用订阅吗?
问题描述
我试图获得一种行为,即如果当前可观察的值发生变化,则应分别调用链接的相应可观察对象。
以下代码按预期工作,但我只需要关于此行为的一些确认,我正在尝试在生产站点上实现它。
我知道 switchMap 取消订阅当前订阅并重新订阅返回的新订阅。但是,它是否也调用订阅的新 observable 来启动并运行它拥有的代码,或者它是由管道操作员运行的,还是我错过了任何关键概念?
有人可以请澄清一下。谢谢你。
这是 stackblitz 代码链接 ::: https://stackblitz.com/edit/rxjs-ktnf9x :: 和概述
let a = new BehaviorSubject(null);
let b = new BehaviorSubject(null);
let c = new BehaviorSubject(null);
let d = new BehaviorSubject(null);
let a$ = a.asObservable();
let b$ = b.asObservable();
let c$ = c.asObservable();
let d$ = d.asObservable();
d$
.pipe(
switchMap(
data => {
console.log("from d :: " + data);
return c$;
}
)
)
.pipe(
switchMap(
data => {
console.log("from c :: " + data);
return b$;
}
)
)
.pipe(
switchMap(
data => {
console.log("from b :: " + data);
return a$;
}
)
)
.subscribe(
data => {
console.log("from a :: " + data);
console.log(""); // for next line.
}
)
b.next("calls");
a.next("allSubs");
c.next("it");
d.next("does");
d.next('yes');
最后 --> 输出 ::: 是的,它调用 allSubs
解决方案
为了让解释更简单。SwitchMap 在 d$ 发出时取消订阅 c$。如果 d 发射一次并且 c 继续发射,您将获得一系列 dccc 如果 d 在中间再次发射,您将获得 dcccdccc
d$
.pipe(
switchMap(
data => {
console.log("from d :: " + data);
return c$;
}
)
)
推荐阅读
- javascript - 加入、分组和计算两个 javascript 对象
- c++ - GDI+ 和多线程
- firebase - 'auth/invalid-api-key' 让 Admin SDK 发现服务帐户时
- angular - 监听指令内的自定义组件事件
- php - 如何从数组中找到特定的id
- r - 如何在程序上计算大量向量之间的角度?
- c++ - set_terminate() 上的 Lambda 函数
- angular - 如何在 Angular 中覆盖 HttpErrorResponse
- python - 将函数应用于 3D、2 通道 Keras 张量的每个元素
- ibm-watson - 我可以将实体或意图作为 json 文件而不是 csv 导入我的 watson 吗?