Javascript 等到下一个可观察到的订阅

Javascript 等到下一个可观察到的订阅,javascript,rxjs,rxjs5,Javascript,Rxjs,Rxjs5,我有一个可观察的,将一如既往地订阅: return oMassChangeOb .subscribe(function (aMassDates) { const oModel = self.getModel("vmCalSpecialDates"); oModel.setProperty("/aActualDates", aMassDates); }, function (oErr) { jQuery.sap.log.fatal(oErr)

我有一个可观察的,将一如既往地订阅:

  return oMassChangeOb
    .subscribe(function (aMassDates) {
      const oModel = self.getModel("vmCalSpecialDates");
      oModel.setProperty("/aActualDates", aMassDates);
    }, function (oErr) {
      jQuery.sap.log.fatal(oErr);
    });
我的问题是,一旦订阅了上述可观察对象,如何运行其他可观察对象

我可以这样做:

  return oMassChangeOb
    .subscribe(function (aMassDates) {
      const oModel = self.getModel("vmCalSpecialDates");
      oModel.setProperty("/aActualDates", aMassDates);
      oSaveCancelFooterStateOb
        .subscribe(function (oBtnState) {
          const oModel = self.getModel("vmButtonsState");
          oModel.setProperty("/bSave", oBtnState.bSave);
          oModel.setProperty("/bCancel", oBtnState.bCancel)
        });
    }, function (oErr) {
      jQuery.sap.log.fatal(oErr);
    });
但我不知道,这是否是正确的道路


有一种方法可以解决该场景,但不知道如何使用它

根据您正在编写的内容,您基本上希望在第一个可观察对象完成后运行第二个可观察对象,在这种情况下,只需将这两个对象链接到一个流中:

return oMassChangeOb
    .do(function (aMassDates) {
      const oModel = self.getModel("vmCalSpecialDates");
      oModel.setProperty("/aActualDates", aMassDates);
    })
    .switchMapTo(oSaveCancelFooterStateOb)
    .do((oBtnState) => {
      const oModel = self.getModel("vmButtonsState");
      oModel.setProperty("/bSave", oBtnState.bSave);
      oModel.setProperty("/bCancel", oBtnState.bCancel)
    }).subscribe(
        undefined,
        onErr => jQuery.sap.log.fatal(oErr)
    );

如果顺序无关紧要,您可以同时使用两个流:


一般注意:尽量将逻辑移入流本身(例如,使用
.do
如上所述),并使订阅尽可能干净和通用,这将使组合(合并、链接等)多个流变得更容易,例如:

let preparedOMassChangeOb = oMassChangeOb
    .do(function (aMassDates) {
      const oModel = self.getModel("vmCalSpecialDates");
      oModel.setProperty("/aActualDates", aMassDates);
    })
    .catch(..some error-handler-logic...);

let preparedOSaveCancelFooterStateOb = oSaveCancelFooterStateOb
    .do((oBtnState) => {
      const oModel = self.getModel("vmButtonsState");
      oModel.setProperty("/bSave", oBtnState.bSave);
      oModel.setProperty("/bCancel", oBtnState.bCancel)
    });

Rx.Observable.merge(
    preparedOMassChangeOb,
    preparedOSaveCancelFooterStateOb
).subscribe();
let preparedOMassChangeOb = oMassChangeOb
    .do(function (aMassDates) {
      const oModel = self.getModel("vmCalSpecialDates");
      oModel.setProperty("/aActualDates", aMassDates);
    })
    .catch(..some error-handler-logic...);

let preparedOSaveCancelFooterStateOb = oSaveCancelFooterStateOb
    .do((oBtnState) => {
      const oModel = self.getModel("vmButtonsState");
      oModel.setProperty("/bSave", oBtnState.bSave);
      oModel.setProperty("/bCancel", oBtnState.bCancel)
    });

Rx.Observable.merge(
    preparedOMassChangeOb,
    preparedOSaveCancelFooterStateOb
).subscribe();