2017-07-20 1 views
0

Je me demande si des méthodes peuvent convertir un flux en un autre. J'ai déjà deux flux numéro $ et couleur $, ils sortent des nombres et des couleurs comme [1, 1, 1, ...] et ['rouge', 'rouge', 'rouge', ...]. Je veux obtenir des sorties comme [1, 1, 1, 'rouge', 'rouge', 'rouge', 'rouge', 'rouge', 'rouge', 1, 1, 1, ... ], ce flux de sortie sautera aléatoirement le nombre $ en couleur $ ou inversement. Je suis un novice à RxJS et n'a pas trouvé une méthode appropriée pour résoudre mon problème. Donc j'ai supposé une méthode jumpWhen(condition, streamJumpTo), une fois que la condition est vraie, le flux de traitement sera déprécié et il sera converti en un nouveau flux et commencer à travailler. La question est, comment puis-je simuler cette procédure en utilisant Rx.js v5? Remarque: $ number et $ color peuvent avoir des opérateurs totalement différents (pas un simple mapTo), donc je ne pense pas que nous devrions essayer de fusionner les deux flux ensemble.Comment émettre de façon conditionnelle deux flux observables?

description ce flux:

Dans un premier temps, les sorties de flux 1 par 300ms, il y a 10% de chances de (Math.random()> 0,9) Numéro de commutation $ à la couleur de $. Si la commutation se produit, le flux s'arrête de sortir 1, il commence à émettre red par 500ms. Le mai de la production globale semble:

 1 - - 1 - - 'red' - - - - 'red' - - - - 'red' - - - - 1 - - 1 - ... 
cond f  f  t    f    f   t  f 
time 300 600  900   1400   1900  2400 2700 
rand 0.5 0.2  0.95   0.99   0.4  0.08 0.1 
+0

Qu'arrive-t au courant si le nombre aléatoire est entre '0.3' et '0.9'? quelle devrait être la sortie? – CozyAzure

+0

@CozyAzure Lorsque le flux actuel est le nombre $, nous obtenons un rand par 300ms, si le rand est entre 0 et 0,9 flux de sortie 1, sinon passer à la couleur $ et immédiatement sortie 'rouge'.Après la commutation, la phase est $ couleur, nous obtenons un rand par 500ms, si le rand est entre 0.3 et 1, flux de sortie 'rouge', sinon passer au numéro $ et immédiatement sortie 1. Au nombre $ phase, nous avons 10% Chance de passer à la couleur $, et en couleur $ phase, nous avons 30% de chance de passer au nombre $. – Zheeeng

Répondre

0

Vous pouvez utiliser Observable.if().

Observable.if(condition, thenSource, [elseSource]) prend en 3 arguments:

  1. Le premier argument prend dans une fonction qui retourne un booléen,
  2. deuxième argument est un observable à être émis si la condition est vrai
  3. et le dernier étant un tableau d'une autre source, qui doit être émis si la condition est fausse.

Puisque vous avez deux numbers$ et colors$ observables, vous pouvez écrire une fonction conditionnelle et décider à émettre observables.

Observable.if(
    () => Math.random() > 0.5, //function that determines your condition 
    number$, //this observable will be emitted if the above function returns true 
    color$ //this will be emitted if false 
    ) 
.subscribe(x => console.log(x)); 

A fonctionnant JSBin.

Edit:

D'après les commentaires, je réalisais que je compris à tort vos besoins. Pour votre cas, vous pouvez utiliser l'opérateur .expand() à retourne répétitivement un Observable de votre choix, et de retarder en conséquence:

let test = Observable 
.of(1) 
.expand((prevData) => { 
    let rand = Math.random(); 
    let number$ = Observable.of(1).delay(300); 
    let color$ = Observable.of('red').delay(500); 

    if (prevData === 1) { 
    return rand > 0.9 ? color$ : number$; 
    } 
    else { 
    return rand < 0.3 ? number$ : color$; 
    } 

}) 
.subscribe(x => console.log(x)) 

Modifié travail JSBin

+0

Désolé de demander où est le doc sur Observable.if dans RxJS 5? J'ai trouvé le [doc dans RxJS 4] (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/if.md), mais les docs RxJS 5 ne mentionnent pas Observable .if et pas de guide de migration à ce sujet. – Zheeeng

+0

Il y a encore des questions, suite à votre démo, je ne peux toujours pas mettre en œuvre le passage à un autre flux à des probabilités différentes en fonction du flux de traitement. Pour les exemples ci-dessus, si le nombre aléatoire supérieur à 0.9 change le nombre $ en couleur $, ou inversement lorsque le nombre aléatoire inférieur à 0.1 et la couleur $ est en cours de traitement. – Zheeeng

+0

@ZhengJiang 'Observable.if' est toujours dans' rxjs5'. Peut-être que les documents ne sont pas mis à jour. Quoi qu'il en soit, voir la modification. – CozyAzure