2017-01-03 3 views
1

Ich versuche eine variable Zeitverzögerung zwischen Array-Elementen mit Observables einzufügen. In diesem Beispiel möchte ich ein Hasen-Icon horizontal auf dem Bildschirm bewegen. Wie ein Wasserwerfer-Rennen in einer Arkade. Hier ist meine EingangsarrayRxJS: Programmierbarer Timer

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

In diesem Beispiel das Kaninchen zu Ort 100 Pixel nach 2 Sekunden bewegen würde, dann an Position 500 Pixel nach 8 Sekunden Verzögerung, etc ....

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

der obigen Code funktioniert nicht. Ich schleife einfach ohne Zeitverzögerung durch das Array. Irgendwelche Ideen?

+0

Mmm ... Ich sehe den Fehler nicht, das funktioniert für mich http://jsbin.com/wogeposefa/edit?js,console,output –

+0

Vielen Dank Miguel für Ihre Codebeispiel. Es war die Rückgabe, die dazu führte, dass mein Code fehlschlug. Ich habe jetzt eine andere Frage ... Wie würde ich x.locationX zurück zum Abonnenten senden? –

+1

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

Antwort

0

Hier ist ein funktionierendes Beispiel, Sie müssen die return-Anweisung eliminieren und eine Ergebnisauswahl [Funktion] zu FlatMap hinzufügen, es wird über jedes Element iterieren und es an Ihr Abonnement übergeben. Hier haben Sie die Arbeitsbeispiel 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

Sie waren ganz in der Nähe. flatMap wird für jede Emission so bald wie möglich ausgeführt (.merge Verhalten). Mit .concatMap wird es die aktuellen Emissions vor dem Start auf den nächsten Prozess:

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>

ist es am besten nicht n Timer haben, wie pro die Antwort von Miguel Lattuada laufen, denn das könnten Sie Speicherprobleme geben.

+0

Mark, danke für das Hinzeigen.Um zu erklären, sagen wir, die inputArray timeDelays wurden umgekehrt, sagen [... 5000, ... 1000, ... 500] Mit flatMap würde das dritte Element zuerst ausgeführt werden. Nicht was ich wollte! ConcatMap hat das behoben, indem ich die Eingaben in der ursprünglichen Reihenfolge belassen habe. –