2017-10-06 20 views
1

im essayant d'avoir un modèle, où mon observable qui produit un objet, se transforme en événements de domaine comme Started, Succès, erreur emited autour de la Producing observable, si cela est logiqueRxJava: Comment préfixer startWith() default emit CHAQUE HEURE parent observable émet?

public Observable<BookRenderingEvent> extractAndRenderObservable(String epubPath) { 
     return extractObservable(epubPath) 
       .flatMapObservable(extractedEpub -> renderObservable(extractedEpub) 
         .<BookRenderingEvent>map(renderedEpub -> new BookRenderingEvent.Success(renderedEpub)) 
         .onErrorReturn(t -> new BookRenderingEvent.Error()) 
         .startWith(new BookRenderingEvent.Started())); 
    } 

private Observable<RenderedEpub> renderObservable(ExtractedEpub extractedEpub) { 
     return Observable.combineLatest(readerConfigObservable(), pagerDimensionsObservable(), ..) 
        .switchMapSingle(foo -> doRenderObservable()) <--- heavy work 
        .map(bar -> new RenderedEpub(bar)) 
} 

renderObservable contient une action lourde donc je veux émettre ces événements d'état, ainsi UI peut réagir en conséquence (avec succès contenant l'objet extraitEpub comme vous pouvez le voir dans la carte)

Quel est mon problème, renderObservable contient combineLatest(), donc il "reste ouvert "et émettent plusieurs fois dans le temps, chaque fois que ses obervables émettent.

Ainsi, le flux des événements est Démarré, Succès, Succès ... Succès.

Je veux qu'il soit lancé, Succès, Mise en route, succès .. etc. i.e. précédez événement a commencé whever combineLatest émet, mais ma connaissance rx est insuffisante.

Merci

Répondre

1

Vous pouvez insérer ce qui suit dans la chaîne observable au bon endroit:

.flatMap(event -> Observable.just(new BookRenderingEvent.Started(), event) 

Ce émettront l'événement Started avant chaque événement qu'il reçoit.

Bien sûr, vous pouvez ajouter dans une logique de sorte que vous n'émettez Started si l'événement est Started, etc.

+0

où le mettriez-vous s'il vous plaît? im hors des idées .. devinant son besoin d'aller après le combineLatest, pour déclencher sur chaque emit, mais alors comment puis-je aussi lancer le doRenderObservable? – urSus

+0

Là où vous avez actuellement le 'startWith()' –

+0

qui donnerait la priorité au succès – urSus

0

Ok Ive réussi à comprendre. L'information clé qui me manquait est que le côté droit de flatmap est souscrit quand le côté gauche émet. Par conséquent, le startWith a dû être déplacé vers le côté droit de flatmap observable, qui est abonné lorsque jamais combineLatest émet

public Observable<BookRenderingEvent> extractAndRenderObservable(String epubPath) { 
     return extractObservable(epubPath) 
       .flatMap(extractedEpub -> Observable.combineLatest(readerConfigObservable(), pagerDimensionsObservable(), ..) 
         .switchMap(foo -> renderObservable(extractedEpub) 
          .<BookRenderingEvent>map(renderedEpub -> new BookRenderingEvent.Success(renderedEpub)) 
          .onErrorReturn(t -> new BookRenderingEvent.Error()) 
          .startWith(new BookRenderingEvent.Started())); 
    }