从一个轨道跳到另一轨



我有以下可观察的:

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

最新更新