2016-12-19 1 views
1

:나는 관찰 다음 한

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보다 큰 경우 유효성을 검사 할, 그래, 다음은 전달 계속해야하는 경우 정렬. 배열이 0이면 다른 관찰 가능해야합니다.

한 레일에서 다른 레일로 점프하는 것, 뭔가 잘못 될 때 (if/else 시나리오).

당신이, 내가 할 수있는 정리가 최초의지도 기능에 볼 수있는 업데이트

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

과 가입 방법은 전혀 호출되지 않습니다.

답변

0

당신은 전형적인 mergeMap() 같은 외모를 설명하는 :

.mergeMap(function(oData) { 
    return oData.data.results.length > 0 
     ? Observable.of(oData.data.results) 
     : Observable.empty(); 
}); 
+0

아니, 내가 무슨 뜻인지, 내가 명확하게 설명하지 않습니다 수 있습니다. 배열이 제로의 경우는, 메소드 체인을 중단 해 다른 방법으로 진행해야한다. 여기에 설명 된대로 http://fsharpforfunandprofit.com/posts/recipe-part2/. –

+0

그래서 "다른 방향으로 가라"는 것은 관측 가능한 체인의 끝을 의미합니까? 당신은 이것을 위해'Observable.empty()'를 사용합니다. – martin

+0

배열이 비어 있으면 예를 들어 다른 변수를 정리하려고합니다. –