等到下一个其他可观察订阅

Wait until an other observable subscribe next

我有一个将照常订阅的可观察对象:

  return oMassChangeOb
    .subscribe(function (aMassDates) {
      const oModel = self.getModel("vmCalSpecialDates");
      oModel.setProperty("/aActualDates", aMassDates);
    }, function (oErr) {
      jQuery.sap.log.fatal(oErr);
    });

我的问题是,如何在订阅了上述 observable 后立即 运行 另一个 observable?

我可以这样做:

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

但我不知道这样走对不对

有一个notification object可以解决这个场景,但是不知道怎么用。

根据您所写的内容,您基本上想要 运行 在第一个 observable 完成后进行第二个 observable,在这种情况下,只需将两者链接到一个流中:

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

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

Rx.Observable.merge(oMassChangeOb, oSaveCancelFooterStateOb)
    .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();