【问题标题】:RxJs hot range observableRxJs 热范围可观察
【发布时间】:2018-07-04 13:41:56
【问题描述】:

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

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,然后第二个 observable 什么都不打印,因为值 1 到 10 是在第一秒内产生的。预期的输出如下所示。

1: 1
1: 2
..
1:10

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

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

谁能给我解释一下?

【问题讨论】:

    标签: rxjs


    【解决方案1】:

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

    您的 sn-p 中的关键点是 range 同步发出它的值然后完成。并且完成会影响从共享的 observable 取消订阅,并且看到引用计数回落到零 - 这会看到共享的 observable 从其源取消订阅。

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2016-05-17
    • 2017-06-11
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多