我有以下可观察的:
let oSelectOb = oSelect
.map(function (oEvent) {
return oEvent.getSource();
})
.map(function (oControl) {
let oItem = oControl.getSelectedItem();
let aKeys = oItem.getKey().split("/");
return {plant: aKeys[0], wc: aKeys[1]};
})
.flatMap(function (oSelectedItem) {
let oModel = self.getModel("weightProtocolService");
let oPlantFilter = new Filter("Plant", sap.ui.model.FilterOperator.EQ, oSelectedItem.plant);
let oWcFilter = new Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, oSelectedItem.wc);
return Rx.Observable.create(function (observer) {
oModel.read("/CostCenterCalendarSet", {
success: function (oData, oResponse) {
observer.next(oResponse);
},
error: function (oError) {
observer.error(oError);
},
filters: [oPlantFilter, oWcFilter]
});
});
})
.map(function (oData) {
return oData.data.results;
});
作为下一步,我想验证oData.data.results
数组是否大于0(如果是),则应继续传递数组。如果阵列相等的零,则应采用其他可观察的。
当出现问题时(如果/其他情况),就像从一个轨道跳到另一轨。
update
oSelect
.map(function (oEvent) {
// Clean up dates
let oModel = self.getModel("vmCalSpecialDates");
oModel.setProperty("/specialDates", []);
return oEvent.getSource();
})
.map(function (oControl) {
let oItem = oControl.getSelectedItem();
let aKeys = oItem.getKey().split("/");
return {plant: aKeys[0], wc: aKeys[1]};
})
.flatMap(function (oSelectedItem) {
let oModel = self.getModel("weightProtocolService");
let oPlantFilter = new Filter("Plant", sap.ui.model.FilterOperator.EQ, oSelectedItem.plant);
let oWcFilter = new Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, oSelectedItem.wc);
return Rx.Observable.create(function (observer) {
oModel.read("/CostCenterCalendarSet", {
success: function (oData, oResponse) {
observer.next(oResponse);
},
error: function (oError) {
observer.error(oError);
},
filters: [oPlantFilter, oWcFilter]
});
});
})
.map(function (oData) {
return oData.data.results;
})
.filter(function (aData) {
return aData.length > 0;
})
.flatMap(function (aData) {
return Rx.Observable.from(aData)
})
.filter(function (oData) {
let oToday = new Date();
return oData.InspectionDate.getTime() > oToday.getTime();
});
您可以在第一个地图功能上看到,我可以在那里清理:
// Clean up dates
let oModel = self.getModel("vmCalSpecialDates");
oModel.setProperty("/specialDates", []);
但是我认为,这不是解决问题的干净方法。它打破了功能编程意识形态。
更新2
我尝试以下尝试:
return oSelect
.map(function (oEvent) {
// Clean up dates
/*let oModel = self.getModel("vmCalSpecialDates");
oModel.setProperty("/specialDates", []);*/
return oEvent.getSource();
})
.map(function (oControl) {
let oItem = oControl.getSelectedItem();
let aKeys = oItem.getKey().split("/");
return {plant: aKeys[0], wc: aKeys[1]};
})
.flatMap(function (oSelectedItem) {
let oModel = self.getModel("weightProtocolService");
let oPlantFilter = new Filter("Plant", sap.ui.model.FilterOperator.EQ, oSelectedItem.plant);
let oWcFilter = new Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, oSelectedItem.wc);
return Rx.Observable.create(function (observer) {
oModel.read("/CostCenterCalendarSet", {
success: function (oData, oResponse) {
observer.next(oResponse);
},
error: function (oError) {
observer.error(oError);
},
filters: [oPlantFilter, oWcFilter]
});
});
})
.map(function (oData) {
return oData.data.results;
})
.flatMap(function (aData) {
if (aData.length === 0) {
return Rx.Observable.empty();
}
return Rx.Observable.from(aData)
})
.filter(function (oData) {
let oToday = new Date();
return oData.InspectionDate.getTime() > oToday.getTime();
});
,订阅方法根本没有被调用。
您描述的内容看起来像典型的mergeMap()
:
.mergeMap(function(oData) {
return oData.data.results.length > 0
? Observable.of(oData.data.results)
: Observable.empty();
});