Ci sono due operatori che possono servire per la vostra proposta.
Zip:
Riferimento per RxJs: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md
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.
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. –