【问题标题】:Why hot observable resubscribe为什么 hot observable 重新订阅
【发布时间】:2017-01-14 20:25:18
【问题描述】:

我有一个监听表选择事件的 observable,它也很热。

代码sn-p:

  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)
  });

如您所见,有两个订阅者监听事件。所以结果应该分享给所有订阅者,这就是所谓的重播效果。

我得到的输出是:

但我希望resubscribe 只输出一次。我做错了什么?

【问题讨论】:

    标签: javascript rxjs rxjs5


    【解决方案1】:

    虽然您的 oTableRowSelect$ 可能是 hot 并且已共享,但它仅在您以某种方式与其他运算符扩展它的部分共享(在您的情况下为 do 和 @987654323 @)。

    在 RxJS 中,任何通过操作符进行的扩展基本上都会返回一个 "new" 流。 为了使这个 “新” 流成为热/共享流,您必须应用一个使其成为热的运算符(sharepublishpublishReplay,等等...)

    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)
      });
    <script src="https://unpkg.com/@reactivex/rxjs/dist/global/Rx.js"></script>

    【讨论】:

    • 就我理解的 hot observable 而言,例如按钮点击事件就是 hot observable。当我有多个订阅者时,我希望他们同时收到消息。
    • 正确,他们确实在 “同时” 收到消息(可能相隔几纳秒 ;-))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多