我正在尝试Angular和rxjs (6.0),但遇到了一个问题。
它开始了,
这是我的样例代码库:https://stackblitz.com/edit/angular-kxqj8d?file=app%2Finput-overview-example.ts
var service = {
isUserSignedIn: null
};
var myObservable$ = new BehaviorSubject(service);
setInterval(function() {
debugger;
service.isUserSignedIn = !service.isUserSignedIn;
service = JSON.parse(JSON.stringify(service));
console.log("--------------------------------------------")
console.log("Value update to : " + service.isUserSignedIn)
myObservable$.next(service);
}.bind(this), 5000);
myObservable$
.pipe(
filter((curr) => curr.isUserSignedIn != null),
distinctUntilChanged((prev, curr) => {
debugger;
console.log("Value during comparison prev: " + prev.isUserSignedIn + " curr: " + curr.isUserSignedIn)
return prev.isUserSignedIn === curr.isUserSignedIn;
}))
.subscribe(value => {
console.log("Got Notified! New Value: " + value.isUserSignedIn);
})
以下是控制台日志:
在"distinctUntilChanged“操作符中,当标志"service.isUserSignedIn”设置为false时,prev和curr的值是相同的。但是,当相同的标志设置为true时,它才能正常工作!
正因为如此,观察者没有得到通知!
我花了两天时间试图弄清楚,但找不到哪里出了问题。
你们能帮帮我吗。
发布于 2018-08-23 03:13:56
您需要将JSON.parse(JSON.stringify(service))
的结果赋给一个新变量,并将其传递给next
。如果您不这样做,那么您将覆盖以前的service值,实际上违背了使用JSON parse/stringify创建副本的目的。
旁注
考虑下面这段更简洁的代码:
interval(5000).pipe(
map(() => {
service.isUserSignedIn = !service.isUserSignedIn;
return JSON.parse(JSON.stringify(service));
}),
distinctUntilChanged((prev, curr) => {
console.log(prev.isUserSignedIn, curr.isUserSignedIn)
return prev.isUserSignedIn === curr.isUserSignedIn;
})
)
.subscribe(value => {
console.log(`Result: ${value.isUserSignedIn}`)
});
https://stackoverflow.com/questions/51977371
复制相似问题