【问题标题】:Why connectable observable get execute only once为什么可连接的 observable 只执行一次
【发布时间】:2023-03-16 20:06:02
【问题描述】:

当另一个流执行时,我有一个可连接的可观察对象:

const source1 = Rx.Observable.of([1,2,3,4,5])
  .do(() => console.log('Do Something!'))
  .map(() => "Always connected.")
  .publish();

source1.subscribe((v) => console.log(v));

const connect = () => {
  let c = false;
  return () => {
    if (!c) {
       console.log("Get connected");
       source1.connect();
       c = true;
    }
  }
}


const source2 = Rx.Observable.fromEvent(document, 'click')
   .do(() => console.log("execute!"))
   .do(connect())
   .switchMapTo(source1);

source2.subscribe((v) => console.log(v));

输出

"execute!"
"Get connected"
"Do Something!"
"Always connected."

进一步点击文档source1 将不再订阅,我的问题是,为什么?

【问题讨论】:

    标签: javascript rxjs rxjs5


    【解决方案1】:

    您确实遇到过这种情况:Rx.Subject loses events

    如果您更新示例的第一部分,您将看到主题收到complete 通知:

    const source1 = Rx.Observable.of([1,2,3,4,5])
      .do(() => console.log('Do Something!'), null, () => console.log('source1 complete'))
      .map(() => "Always connected.")
      .publish();
    

    这会将 Subject 标记为已关闭,并且不会进一步重新发送任何值。

    有关更多详细信息,请参阅我上面的链接答案。您也可以看看 Ben Leash(RxJS 5 的首席开发人员)的 On The Subject Of Subjects (in RxJS)(段落 Subjects Are Not Reusable)。

    【讨论】:

    • 您有什么建议的解决方案吗?当然,这是一种常见的模式,您希望多次执行 observable。我正在尝试用 RxSwift 实现类似的东西,我有一个可连接的 observable 来包装网络请求。如果网络请求失败,那么我希望能够重新连接...
    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2019-04-29
    相关资源
    最近更新 更多