2016-12-19 3 views
0

Ich habe folgende beobachtbar:überspringen weitere Verfahren Verkettungs

_processSelectedPlantWcOb: function (oSelect) { 
     let self = this; 
     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; 
     }) 
     .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(); 
     }); 
    }, 

Angenommen, ich habe eine Instanzvariable x = false, die in Zukunft x = true ändern werden. Auf der zweiten Karte möchte ich fragen, ob x is true. Wenn ja, sollte es abonnieren und der Stream wird dort aufhören.

Um zu verdeutlichen, was ich meine. Betrachten Sie die zweite Karte. Das, was es wird wie folgt aussehen:

.map(function (oControl) { 
    if(x === true) { 
     // Subscribe it. stop the stream 
    } 
    let oItem = oControl.getSelectedItem(); 
    let aKeys = oItem.getKey().split("/"); 
    return {plant: aKeys[0], wc: aKeys[1]}; 
}) 

Antwort

0

Wenn Sie Ihren Strom abschließen möchten, basierend auf x = true würde ich am takeUntil Betreiber suchen schlagen und statt einer variablen x verwenden, um eine Subject, auf dem Sie etwas einmal, wenn x emittieren wird true.

Ein Subject ist ein Observable und ein Observer in einem, so dass Sie das in TakeUntil verwenden können, um Ihren Stream fertigzustellen.

+0

Können Sie bitte ein Beispiel erstellen. Ich habe vergessen zu erwähnen, das ist ein heißes beobachtbares. '_createCalendarSelectObservable: function (oCalendar) { return Rx.Observable.create (function (Beobachter) { oCalendar.attachSelect (function (oEvent) { observer.onNext (oEvent); }) }); }, 'das wird jedes Mal ausgelöst, wenn der Benutzer das Datum drückt. –

+0

Mit takeUntil würde es nicht funktionieren, da die x-Variable auf true gesetzt wird, wenn auf eine Schaltfläche geklickt wird. –