2017-01-03 2 views
1

Je suis en train d'insérer un retard de temps variable entre les éléments du tableau à l'aide Observables. Dans cet exemple, je veux déplacer une icône de lapin horizontalement sur l'écran. Comme une course de pistolet à eau à une arcade. Voici mon tableau d'entréeRxJS: programmable

var inputArray = [ 
     {locationX: 100, timeDelay: 2000}, 
     {locationX: 500, timeDelay: 8000}, 
     {locationX: 700, timeDelay: 3000} 
    ] 

Dans cet exemple, le lapin se déplacerait à l'emplacement 100px au bout de 2 secondes, puis à l'emplacement 500px après un délai de 8 secondes, etc ....

var obs = Rx.Observable.from(inputArray) 
     .flatMap(x => return Rx.Observable.timer(x.timeDelay)) 

ci-dessus le code ne fonctionne pas. Je boucle juste à travers le tableau sans délai. Des idées?

+0

Mmm ... Je ne vois pas l'erreur, cela fonctionne pour moi http://jsbin.com/wogeposefa/edit?js,console,output –

+0

Merci Miguel pour votre exemple de code. C'est le retour qui a fait échouer mon code. J'ai maintenant une autre question ... Comment renvoyer x.locationX à l'abonné? –

+1

.flatMap (x => Rx.Observable.timer (x.timeDelay) .map (() => x.locationX) – Meir

Répondre

0

Voici un exemple pratique, vous devez éliminer l'instruction return, et ajouter un sélecteur de résultat [function] à flatMap, il va parcourir chaque élément et le passer à votre abonnement. Ici vous avez l'exemple de travail http://jsbin.com/jutizataji/edit?js,console,output

var inputArray = [ 
 
     {locationX: 100, timeDelay: 500}, 
 
     {locationX: 500, timeDelay: 1000}, 
 
     {locationX: 700, timeDelay: 5000} 
 
    ] 
 

 
Rx.Observable 
 
    .from(inputArray) 
 
    .flatMap(x => Rx.Observable.timer(x.timeDelay), (x) => x) 
 

 
    // here x represent each object inside your input array, to access location do x.locationX 
 
    .subscribe((x) => { console.log(x); });

0

Vous étiez très proche. flatMap s'exécutera pour chaque émission dès qu'elle sera disponible (comportement .merge). En utilisant .concatMap il traitera l'émission en cours avant de commencer la suivante:

var inputArray = [ 
 
      {locationX: 100, timeDelay: 500}, 
 
      {locationX: 500, timeDelay: 1000}, 
 
      {locationX: 700, timeDelay: 5000} 
 
     ] 
 
    
 
    Rx.Observable 
 
     .from(inputArray) 
 
     .concatMap(i => Rx.Observable.just(i).delay(i.timeDelay)) 
 
     .subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>

Il est préférable de ne pas avoir n minuteries en cours d'exécution selon la réponse de Miguel Lattuada parce que cela pourrait vous donner des problèmes de mémoire.

+0

Mark, merci de le signaler. pour expliquer, disons que les timeDelays les inputArray ont été annulées, par exemple [... 5000, ... 1000, ... 500] Avec flatMap le troisième élément serait exécuté en premier. Pas ce que je voulais! ConcatMap a fixé cela en gardant les entrées dans l'ordre d'origine. –