我试图获得一种行为,如果当前可观察值的值发生变化,则应分别调用链接的各个可观察值。
以下代码按预期工作,但是我只需要对此行为进行一些确认,我正在尝试在生产现场实现此目的。
我知道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
答案 0 :(得分:0)
使解释更简单。当d $发出时,SwitchMap取消订阅c $。如果d发射一次并且c继续发射,您将获得d-c-c-c序列 如果d在中间再次发射,您将得到d-c-c-c-d-c-c-c
d$
.pipe(
switchMap(
data => {
console.log("from d :: " + data);
return c$;
}
)
)