2015-01-31 7 views
6

Considera che ho due flussi di dati, esiste un modo per unirli e applicare condizioni sui dati tra questi due flussi? Per esempioCome unire due flussi (senza valori null) e applicare le condizioni sulle coppie?

Stream A : A, B, C, D.... 
Stream B : -, A, -, -.... 
Composed : (A,-),(B,A),(C,-),(D,-).... 

Come ottenere composta flusso sopra utilizzando rxjs? Vorrei applicare le condizioni sugli stream composti per sollevare alcune notifiche. Sarebbe anche possibile utilizzare gli ultimi dati noti non nulli, per esempio vedere il flusso composto di seguito.

Stream A : A, B, C, D.... 
Stream B : 1, null, 2, null.... 
Composed : (A,1),(B,1),(C,2),(D,2).... 

Ho appena iniziato a giocare con i flussi reattivi idea, quindi per favore mi corregga se ho frainteso il concetto di flussi reattivi.

+0

Non so come sia esattamente in RxJS, ma in generale il primo problema viene in genere risolto con 'zip' dopo il quale i due flussi vengono uniti come flusso di coppie. Non so come risolvere il secondo problema. –

risposta

11

Ci sono due operatori che possono servire per la vostra proposta.

Zip:
Rx Zip
Riferimento per RxJs: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md

CombineLatest:
Rx CombineLatest
Riferimento per RxJs: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/combinelatest.md

Le immagini spiegano le differenze tra entrambi. Ora hai unito l'osservabile e hai solo bisogno di filtrare, usando where, che filtrerà se uno dei valori è nullo.

Purtroppo né gli operatori possono ottenere questo comportamento che descrivi:

Stream A : A, B, C, D, E.... 
Stream B : 1, null, 2, null, 3.... 
Composed : (A,1),(B,1),(C,2),(D,2).... 

Se si utilizza Zip e Dove (filtrando i valori nulli dopo), il risultato sarà:

Composed: (A,1),(C,2),(E,3) 

Se si utilizza Dove (filtro valori null in precedenza) e Zip, il risultato sarà:

Composed: (A,1),(B,2),(C,3) 

Se si utilizza CombineLatest dipenderà l'ordine che gli eventi accade nei ruscelli, e, naturalmente, dove metterete l'operatore where, il risultato può essere diverso da quello che si mostrato, ad esempio:

Stream A : A, B, C, D.... 
Stream B : 1, null, 2, null.... 
Composed : (A,1),(B,1),(C,1),(C,2),(D,2).... // OR 
Composed : (A,1),(B,1),(B,2),(C,2),(D,2).... 

A meno che non avere requisiti più specifici, penso che una delle opzioni che ho citato è quello che stai cercando, sentiti libero di aggiungere informazioni.

Ci sono diversi modi per comporre di osservabili, altri operatori non menzionate sono:

  • distinctUntilChanged, potrebbero essere aggiunti nella finale della composizione, utilizzando la funzione del selettore principale di limitare solo per parte di zip o al più tardi valore.
  • switch, utilizzato per combinare uno osservabile all'interno di un altro.
Problemi correlati