等到下一个其他可观察订阅
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();
我有一个将照常订阅的可观察对象:
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();