【问题标题】:Why second subscription to Observable.of gives another result?为什么第二次订阅 Observable.of 会给出另一个结果?
【发布时间】:2020-02-05 03:26:41
【问题描述】:

我使用“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 个元素的数组(包括“鸟”),但我希望得到初始数组 - 里面只有“狗”和“猫”。我不明白为什么会这样。是否有一些缓存或类似的东西?

我认为 Observables 在默认情况下是冷的,每个新订阅都会将起始值返回给新订阅者。

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这里的“真正”问题是为什么当结果 observable 发送给另一个订阅者时,传递给 of 的实例没有恢复。答案是of 是一个被调用的函数,你将它传递给一个实例。

      of(someInstance) // ← executes once
      

      所以当您调用of 时,传入的实例也只会创建1x。现在生成的 Observable 实例将发出您传递给of 的对象的实例。在这个 observable 上多次调用 subscribe 不会触发 of 再次被调用来创建一个新的 observable。相反,传递给 observable 的同一个实例将从它发出。

      再说一遍:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多