2016-12-21 4 views
0

Ich habe folgende Funktion:Nach reaktiven funktionellen Paradigma

_processCalenderSelect: function (oCalendarSelectOb, oEditButton) { 
    let self = this; 

    return oCalendarSelectOb 
    .switchMap(function (oCalendar) { 
     return oEditButton.getPressed()? Rx.Observable.of(oCalendar) : Rx.Observable.never(); 
    }) 
    .mergeMap(function (oCalendar) { 
     return Rx.Observable.from(oCalendar.getSource().getSelectedDates()); 
    }) 
    .map(function (oDateRange) { 
     return oDateRange.getStartDate(); 
    }); 

}, 

Der erste Parameter ist nur eine beobachtbare und das zweite ist ein Objekt.

Betrachten Sie die switchMap Methode, ich frage, ob die Taste gedrückt ist oder nicht.

Meine Frage ist, breche ich reaktives funktionales Paradigma, wenn ich nach dem Knopfzustand innerhalb des Verschlusses frage?

.switchMap(function (oCalendar) { 
     return oEditButton.getPressed()? Rx.Observable.of(oCalendar) : Rx.Observable.never(); 
    }) 

Antwort

1

Ohne zu wissen, wie Sie Ihre Ströme ausgelöst werden, ist dies „technisch in Ordnung“, aber wie Sie wahrscheinlich schon erraten, Sie sind Art der Zerschlagung der „Geist“ mit rein, staatenlos Funktionen durch einen nicht-Stream Einführung -State, die oEditButton - der Strom kann nicht garantiert werden, um das gleiche Ergebnis mit den gleichen Eingaben jedes Mal zu haben, weil es einen "externen" Zustand (Knopf gedrückt oder nicht) gibt.

Also der "cleaner" Ansatz wäre (unsicher, ob das für Ihre Anwendung funktioniert), etwas wie einen oEditButtonClicked$ -Event-Stream zu haben, der die Verarbeitung ausgewählter Daten auslöst.

oEditButtonClicked$ 
    .switchMapTo(oCalenderSelect$) 
    .mergeMap(cal => Rx.Obserbalbe.from(cal.getSource....)) 

Als Randnotiz, wenn Sie nicht in der Lage sind, eine derartige Ereignis-Strom einführen, könnten Sie immer noch Ihren Code verbessern, indem Sie skipWhile:

return oCalendarSelectOb 
    .skipWhile(() => oEditButton.getPressed()) 
    .mergeMap(function (oCalendar) { 
     return Rx.Observable.from(oCalendar.getSource().getSelectedDates()); 
    }) 
    .map(function (oDateRange) { 
     return oDateRange.getStartDate(); 
    }); 

(dies nicht lösen die anfängliche Frage jedoch, nur ein Hinweis auf die Seite)

+0

Der Stream wird ausgelöst, wenn jemand Datum im Kalender auswählen. –

+0

Ich habe den ersten Vorschlag oben implementiert und es funktioniert wie erwartet. Vielen Dank. Es ist so schwierig für einen Anfänger zu wissen, was mit rxjs möglich ist. –

+1

Fast alles ist möglich - diese Frage ist eher eine Frage des persönlichen Geschmacks und wie "perfekt" Ihr Code sein soll - aber von einem streng technischen Aspekt aus sollte Ihr Code bereits für Ihren Anwendungsfall gut funktionieren. – olsn

Verwandte Themen