【问题标题】:Why observable does not get subscribed为什么 observable 没有被订阅
【发布时间】:2017-01-06 07:55:51
【问题描述】:

我有以下 observable,用于验证模型的更改。

sn-p 代码如下:

  const oSaveCancelStateOb = this.determineSaveCancelStateOb(oTableItemChanges, oSaveCancelStateModelOb);
  oSaveCancelStateOb.subscribe(function (oOb) {
    console.log("Subscribe 1");
  });

  oDelBtnOb
    .switchMapTo(oSaveCancelStateOb)
    .subscribe(function (oOb) {
      console.log("Subscribe 2");
    });

determineSaveCancelStateOb 的实现如下:

determineSaveCancelStateOb: function (oInspectionServiceOb, oSaveCancelStateModelOb) {
  return oInspectionServiceOb
    .map(function (bState) {
      return bState ? {bSave: true, bCancel: true} : {bSave: false, bCancel: false};
    })
    .switchMap(function (oState) {
      return oSaveCancelStateModelOb
        .map(function (oModel) {
          return {oModel: oModel, oState: oState};
        })
    });
},

oSaveCancelStateOb 验证,如果模型上发生了某些变化,则它是冷可观察的。

第二个 observable oDelBtnOb 是一个 hot observable,它监听鼠标按钮的点击。

我的期望是,当我点击按钮时,它应该会在控制台上显示:

Subscribe 1
Subscribe 2

但我只有一个

Subscribe 2

为什么第一个 observable 没有被订阅?

更新

看看下面的代码sn-p:

//Create an observable that emits a value every second
const sample1$ = Rx.Observable.of(true);
sample1$.subscribe(val => console.log(val))
//Create an observable that emits every time document is clicked
const sample2$ = Rx.Observable.fromEvent(document, 'click');

sample2$.switchMapTo(sample1$).subscribe(val => console.log(val))

当我点击文档时,我预计true 会输出两次。

【问题讨论】:

    标签: javascript rxjs rxjs5


    【解决方案1】:

    据我了解,您的期望不正确。在您的最后一个示例中,将发生以下情况:

    1. 在加载代码后,sample1$ 上的订阅将执行并处理流中的所有值,并将每个可用值发送到控制台。之后,sample1$ 订阅完成。
    2. 点击文档后,switchMapTo 会生成一个新的sample1$ 流,它的值(仅true)会发出并发送到控制台,之后这个 observable 就完成了。

    【讨论】:

    • 你提到的第二点,第一次订阅点击文档时不会再次执行?
    • @zero_coding 正确,点击文档时第一次订阅已经完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多