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