2016-12-31 7 views
1

Ich habe eine beobachtbare, die wie üblich zeichnen wird:Warten Sie, bis eine andere beobachtbare abonnieren nächsten

return oMassChangeOb 
    .subscribe(function (aMassDates) { 
     const oModel = self.getModel("vmCalSpecialDates"); 
     oModel.setProperty("/aActualDates", aMassDates); 
    }, function (oErr) { 
     jQuery.sap.log.fatal(oErr); 
    }); 

Meine Frage ist, wie man läuft eine andere beobachtbar, sobald die oben beobachtbar wurde abonniert?

Ich konnte es wie folgt tun:

return oMassChangeOb 
    .subscribe(function (aMassDates) { 
     const oModel = self.getModel("vmCalSpecialDates"); 
     oModel.setProperty("/aActualDates", aMassDates); 
     oSaveCancelFooterStateOb 
     .subscribe(function (oBtnState) { 
      const oModel = self.getModel("vmButtonsState"); 
      oModel.setProperty("/bSave", oBtnState.bSave); 
      oModel.setProperty("/bCancel", oBtnState.bCancel) 
     }); 
    }, function (oErr) { 
     jQuery.sap.log.fatal(oErr); 
    }); 

Aber ich weiß nicht, ob es der richtige Weg zu gehen ist.

Es gibt eine notification object, die das Szenario lösen könnte, aber nicht wissen, wie man es benutzt.

Antwort

2

Von dem, was Sie schreiben, wollen Sie im Grunde die zweite beobachtbare, nachdem die erste beendet ist, in diesem Fall laufen, die Kette nur beide in einen Strom:

return oMassChangeOb 
    .do(function (aMassDates) { 
     const oModel = self.getModel("vmCalSpecialDates"); 
     oModel.setProperty("/aActualDates", aMassDates); 
    }) 
    .switchMapTo(oSaveCancelFooterStateOb) 
    .do((oBtnState) => { 
     const oModel = self.getModel("vmButtonsState"); 
     oModel.setProperty("/bSave", oBtnState.bSave); 
     oModel.setProperty("/bCancel", oBtnState.bCancel) 
    }).subscribe(
     undefined, 
     onErr => jQuery.sap.log.fatal(oErr) 
    ); 

Wenn der Auftrag doesn‘ t gleich, Sie beide Ströme nehmen und verwenden merge:

Rx.Observable.merge(oMassChangeOb, oSaveCancelFooterStateOb) 
    .subscribe(
     undefined, 
     onErr => jQuery.sap.log.fatal(oErr) 
    ); 

Als allgemeine Anmerkung: Versuchen um so viel Logik wie möglich in den Stream selbst zu bringen (z.B. unter Verwendung .do wie ich oben) haben und haben das so sauber und allgemein wie möglich abonnieren, das macht es viel einfacher zu kombinieren (verschmelzen, Kette, ect ..) mehrere Streams, z.B .:

let preparedOMassChangeOb = oMassChangeOb 
    .do(function (aMassDates) { 
     const oModel = self.getModel("vmCalSpecialDates"); 
     oModel.setProperty("/aActualDates", aMassDates); 
    }) 
    .catch(..some error-handler-logic...); 

let preparedOSaveCancelFooterStateOb = oSaveCancelFooterStateOb 
    .do((oBtnState) => { 
     const oModel = self.getModel("vmButtonsState"); 
     oModel.setProperty("/bSave", oBtnState.bSave); 
     oModel.setProperty("/bCancel", oBtnState.bCancel) 
    }); 

Rx.Observable.merge(
    preparedOMassChangeOb, 
    preparedOSaveCancelFooterStateOb 
).subscribe(); 
Verwandte Themen