【发布时间】:2019-09-26 12:57:28
【问题描述】:
我试图获得一种行为,即如果当前可观察的值发生变化,则应分别调用链接的各个可观察对象。
以下代码按预期工作,但我只需要对此行为进行一些确认,我正在尝试在生产站点上实现它。
我知道 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
【问题讨论】:
-
该状态是错误的 switchman 改变了你可以说的时间线。但不,它不会订阅或取消订阅
-
hm, as per this website learnrxjs.io/operators/transformation/switchmap.html ****** switchMap 和其他扁平化操作符的主要区别在于取消效果。在每次发射时,先前的内部 observable(您提供的函数的结果)被取消并订阅新的 observable。你可以通过短语 switch to a new observable 记住这一点。 ******
-
它说切换到一个新的 observable 看不到任何关于订阅的信息
-
我什至不明白你到底在问什么,但我为你删除了管道并格式化了一下。 link
-
谢谢你的回复,但在 stackblitz [新链接 :: stackblitz.com/edit/rxjs-uk8q3e ] 最初我没有发出任何新的 c 值,它是用 null in 启动的行为主体.. 然而,当我向 d 发出某些东西时,会触发其他值(如 c、b、a)发出 null。好想知道。如果 switchmap 触发了 c$ 订阅,尽管 c 没有发出任何内容。或 b 或 a。还是来自管道。是问题。
标签: rxjs