为什么第二次订阅Observable.of会给出另一个结果?

时间:2019-10-07 19:48:34

标签: angular rxjs

我使用'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在默认情况下是冷的,每个新订阅都将初始值返回给新订阅者。

2 个答案:

答案 0 :(得分:2)

这里的“真实”问题是为什么当生成的可观察对象发射到另一个订户时,传递给of的实例为什么不被恢复原状?答案是of是一个被调用的函数,您向它传递了一个实例。

of(someInstance) // ← executes once

因此,当您调用of时,传入的实例也只会创建1x。现在,生成的Observable实例将发出您传递给of的对象的实例。在此可观察对象上多次调用订阅将不会触发of被再次调用以创建新的可观察对象。取而代之的是,传递给该可观察对象的那个实例将被发出。

再次如此:

  • of(someInstance) //←执行一次以创建Observable
  • 分配给您的字段observable的结果(类型为Observable
  • 订阅字段observable将始终发出最初传递给of的同一实例

答案 1 :(得分:1)

这是因为您正在修改数组的元素,并且引用是共享的。两个订阅都获得对同一对象的引用。 getObservableOneMoreTimegetObservable之后获得其引用,因此到运行pets的引用时,新元素已被更新。

相关问题