我使用'of'运算符创建Observable,并且流由带有对象数组的对象组成。我订阅它,然后将某些内容推送到该对象数组中。
接下来,我再次订阅Observable,并期望与第一次订阅期间的值相同,但是我得到具有先前推送值的对象数组。这是为什么?
有一些代码:
ngOnInit() {
this.observable = of(
{
name: "Mark",
pets: [{
type: "dog",
age: 3
},
{
type: "cat",
age: 2
}]
});
this.getObservable();
this.getObservableOneMoreTime();
}
getObservable() {
this.observable.subscribe(r => {
this.state = r
this.state.pets.push({type: "bird", age: 1});
})
}
getObservableOneMoreTime() {
setTimeout(() => {
this.observable.subscribe(r => {
console.log(r);
})
}, 5000)
}
在控制台中,我得到一个包含3个元素的数组(包括“ bird”),但我希望获得初始数组-里面只有“ dog”和“ cat”。我不明白为什么这样做会如此。有缓存或类似的东西吗?
我认为Observables在默认情况下是冷的,每个新订阅都将初始值返回给新订阅者。
答案 0 :(得分:2)
这里的“真实”问题是为什么当生成的可观察对象发射到另一个订户时,传递给of
的实例为什么不被恢复原状?答案是of
是一个被调用的函数,您向它传递了一个实例。
of(someInstance) // ← executes once
因此,当您调用of
时,传入的实例也只会创建1x。现在,生成的Observable实例将发出您传递给of
的对象的实例。在此可观察对象上多次调用订阅将不会触发of
被再次调用以创建新的可观察对象。取而代之的是,传递给该可观察对象的那个实例将被发出。
再次如此:
of(someInstance)
//←执行一次以创建Observable
observable
的结果(类型为Observable
)observable
将始终发出最初传递给of
的同一实例答案 1 :(得分:1)
这是因为您正在修改数组的元素,并且引用是共享的。两个订阅都获得对同一对象的引用。 getObservableOneMoreTime
在getObservable
之后获得其引用,因此到运行pets
的引用时,新元素已被更新。