我有以下功能:
_processSelectedPlantWcOb: function (oSelectOb, oSetNewDates, oWpServiceOb, fnQueryDatesPlantWcOb) {
let self = this;
return oSelectOb
.map(function (oEvent) {
return oEvent.getSource();
})
.switchMap(function (oSelect) {
return oSetNewDates.mapTo(oSelect);
})
.map(function (oSelect) {
let oItem = oSelect.getSelectedItem();
let aKeys = oItem.getKey().split("/");
return {sPlant: aKeys[0], sWc: aKeys[1]};
})
.switchMap(function (oSelected) {
return fnQueryDatesPlantWcOb(oWpServiceOb, oSelected.sPlant, oSelected.sWc);
});
},
正如您所看到的,最后一个参数是期望一个函数,而函数fnQueryDatesPlantWcOb
的实现如下所示:
_processQueryDatesPlantWcOb: function (oWpServiceOb, sPlant, sWc) {
return oWpServiceOb
.switchMap(function (oModel) {
let oPlantFilter = new sap.ui.model.Filter("Plant", sap.ui.model.FilterOperator.EQ, sPlant);
let oWcFilter = new sap.ui.model.Filter("WorkCenter", sap.ui.model.FilterOperator.EQ, sWc);
return Rx.Observable.create(function (subscriber) {
oModel.read("/CostCenterCalendarSet", {
success: function (oData, oResponse) {
subscriber.next(oResponse);
},
error: function (oError) {
subscriber.error(oError);
},
filters: [oPlantFilter, oWcFilter]
});
});
})
.filter(function (oData) {
return oData.data.results.length > 0
})
.mergeMap(function (oData) {
return Rx.Observable.from(oData.data.results);
})
.map(function (oData) {
let oDate = oData.InspectionDate;
return new Date(oDate.getFullYear(), oDate.getMonth(), oDate.getDate());
})
.filter(function (oDate) {
let oToday = new Date();
return oDate.getTime() > oToday.getTime();
})
.map(function (oDate) {
return oDate.getTime();
});
},
如您所见,参数sPlant
和sWc
将在switchMap
函数中使用。
我想知道的是,我是否打破了功能范式?
在我看来,我没有打破它,因为每次当我传递相同的sPlant
和sWc
值时,我都会得到相同的结果,但我不确定。
答案 0 :(得分:0)
我没有用JS编程,但“功能范例”实际上定义了关于(pure) functions的两个属性:
- 如果给出相同的参数,它总是返回相同的结果。这称为参照透明度,您可以将其添加到$ 5编程术语列表中。
- 不会引起任何副作用。也就是说,该函数不能在函数本身之外进行任何可观察的更改 - 例如,通过更改外部可访问的可变对象或写入文件。
由于oModel.read("/CostCenterCalendarSet", ...)
似乎做了I / O,所以它不是纯函数(请查看this question以了解为什么阅读也是副作用。)
此外,如果使用日期/时间的函数可以完全透明,则它是controversial topic - 特别是如果它不是参数列表的一部分。