为什么热观察重新订阅

时间:2017-01-14 20:25:19

标签: javascript rxjs rxjs5

我有一个可以观察表选择事件的观察,它也很热。

代码段:

  const oTableRowSelect$ = TableOb.rowSelectionChangeEvent$(this.getById("ins-table"));
  const test = oTableRowSelect$
    .do(function () {
      console.log("resubscribe");
    })
    .map(function () {
      return 4;
    });

  test.subscribe(function (o) {
    console.log("Select1" + o);
  });

  test.subscribe(function (o) {
    console.log("Select2" + o)
  });

正如您所看到的,有两个订阅者可以监听该事件。因此,结果应该分享给所有订户,即所谓的重播效果。

我得到的输出是: enter image description here

但我期待resubscribe仅输出一次。我做错了什么?

1 个答案:

答案 0 :(得分:1)

虽然您的oTableRowSelect$可能并且已共享,但它只会在您使用其他运算符以某种方式扩展它的部分(在您的情况下{{1})中共享}和do)。

在RxJS中,通过运算符的任何扩展基本上都会返回" new" 流。 为了使此"新" 流热/共享,您必须应用使其变热的运算符(mapsharepublish,等等......)



publishReplay

const hotBaseStream$ = new Rx.BehaviorSubject("Hi!");

const test = hotBaseStream$
    // -------- below this line you get a "new" stream, that is not hot any more
    .do(() => console.log("resubscribe"))
    .map(() => 4)
    .publishReplay().refCount();  // remove this part and you will have back your original behavior

  test.subscribe(function (o) {
    console.log("Select1 ", o);
  });

  test.subscribe(function (o) {
    console.log("Select2 ", o)
  });