可观察到的 RxJs 热范围

标签 rxjs

我正在尝试创建一个热范围可观察对象。这意味着当我有一个观察者在一定的超时后观察可观察值时,它不应该收到已经发布的值。我创建了以下程序:

import Rx from "rxjs/Rx";

var x =   Rx.Observable.range(1,10).share()


x.subscribe(x => {
    print('1: ' + x);
  });

setTimeout(() => {
  x.subscribe(x => {
    print('2: ' + x);
  });
}, 1000);

  function print(x) {
    const element = document.createElement('div');
    element.innerText = x;
    document.body.appendChild(element)
  }

我希望这个程序打印 1 到 10,然后第二个可观察值不打印任何内容,因为值 1 到 10 是在第一秒内生成的。预期输出如下所示。

1: 1
1: 2
..
1:10

但是,我看到它还打印了所有值。尽管我已将 share() 运算符放在其后面。输出如下所示。

1: 1
..
1: 10
2: 1
..
2: 10

有人可以向我解释一下吗?

最佳答案

share 返回一个对订阅进行引用计数的可观察对象。当引用计数从零变为一时,共享可观察对象订阅源 - 在您的情况下,订阅 range 可观察对象。当引用计数回落到零时,它就会取消订阅源。

代码片段中的关键点是 range 同步发出其值,然后完成。完成会影响共享可观察量的取消订阅,并且引用计数会回落到零 - 这会看到共享可观察量从其源中取消订阅。

如果将 share 替换为 publish,您应该会看到预期的行为:

var x =   Rx.Observable.range(1,10).publish();
x.subscribe(x => print('1: ' + x));
x.connect();

publish 返回一个 ConnectableObservable,它不是引用计数的,并提供一个 connect 方法,可以调用该方法来显式连接(即订阅)来源。

关于可观察到的 RxJs 热范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51175131/

相关文章:

angular - 如果以 Angular 调用两次,如何等待相同的可观察对象完成?

Angular等待多个异步post请求然后调用另一个端点

javascript - rxjs/订阅没有导出成员 'Subscription'

javascript - RxJs:顺序发送请求并不是真正顺序的

javascript - 将 rxjs 5 重构为 rxjs 6 代码 - retryWhen

angular - rxjs 6 属性 'of' 在类型 'typeof Observable' 上不存在

javascript - 如何在 Observable 方法中顺序调用异步函数?

angular - 如何在 Angular 中使用 subscribe-next RxJS?

rxjs - 使用 rxjs 5 运行平均值

angular - 用管道控制 Observables