2016-10-17 1 views
1

Stellen Sie sich vor, wir haben eine Warteschlange von Booleans (wir brauchen keine komplexe Datenstruktur, da wir nur die Tatsache der Reihenfolge speichern möchten). Gegenstände können jederzeit in beliebiger Geschwindigkeit in die Warteschlange gelangen. Das Observable würde Elemente aus dieser Warteschlange auffüllen und sie in einer verzögerten Weise emittieren, aber die erste Emission muss nicht verzögert werden. Nachdem die Warteschlange leer ist, bleibt sie in der Warteschleife, bis ein neues Element in die Warteschlange kommt, die es sofort ausgibt. Bitte helfen Sie mir, dieses Verhalten zu implementieren.Implementieren verzögerte Warteschlange mit RxJs Observable

Gegeben ein Benutzer kann eine Taste drücken, die einen Zähler erhöht. Beim Start ist der Zähler auf 0 und der Benutzer klickt zweimal in 500 ms. Der erste Klick erhöht den Zähler auf einen, der zweite Klick verzögert sich um 500 ms. Der Benutzer wartet dann mehr als 500 ms und klickt. Der dritte Klick muss den Zähler sofort inkrementieren, da sonst keine weitere Inkrement-Aktion läuft. Wenn der dritte Klick im 500-ms-Fenster passiert, muss er warten, bis der andere beendet ist.

Ja, ich denke, ich habe dein Problem @estus. Irgendwie wäre es notwendig zu registrieren, wo die letzte Aktion in ihrem Fortschritt ist. Die Zeit speichern, wenn es ausgegeben wurde oder so.

Vorausgesetzt, der erste Klick ist 300ms vorher passiert und ein neuer Klick passiert. In diesem Fall muss der 2. Klick nur 200ms warten. enter image description here

Update1: Here ist der Code, basierend auf Dorus Antwort

+0

Das sind zwei verschiedene Fälle. Wenn Sie den vorhandenen Code eingeben, erhalten Sie eine Antwort, die zu Ihrem Fall passt (falls vorhanden). – estus

+0

Es gibt noch keinen Code. Ich bin dabei, etwas in Jsbin mit Dorus 'Antwort zu implementieren. Das Observable ist wie ein Wächter. Es lässt andere erst durch, wenn der Passagier die Pufferzone aka verlassen hat. kam weit genug vom Tor weg. Wenn sich niemand in der Pufferzone befindet, kann der nächste Passagier sofort durchgehen. Das muss ich beobachtbar umsetzen. – apreg

+0

Für den ersten Fall geben Sie bitte an, welche Eingabe Sie erwarten und welche Ausgabe (mit ms-Zeitleiste), weil die Beschreibung nicht spezifisch genug ist. Der zweite Fall ist nicht nur ein Beispiel, sondern ein anderer Fall, und es ist nicht klar, was mit einem dritten Klick im 500ms-Fenster geschehen soll. Wenn für Ihre Frage Rezepte für * beide * Fälle erforderlich sind, geben Sie dies bitte explizit an. – estus

Antwort

6

Sie concatMap verwenden können:

delay = 1000; // delay in ms 
queue.concatMap(e => 
    Rx.Observable.of(e) // emit first item right away 
     .concat(Rx.Observable.empty().delay(delay)) // delay next item 
) 
+0

Erstaunlich! Brillant! – apreg

+2

FYI. Ich musste den Code ein bisschen ändern, um einen Fehler zu vermeiden: 'Rx.Observable.empty(). Verzögerung (Verzögerung)' – apreg

+0

@apreg Ups richtig, reparierte ich meine Antwort für andere :) – Dorus