2017-12-19 2 views
1

Ich möchte eine Liste von Elementen erstellen, die in einem bestimmten Zeitraum auftauchen. Wenn das erste Element erscheint, möchte ich den Timer starten, und bis der Timer abgeschlossen ist, müssen alle weiteren Objekte zur selben Liste hinzugefügt werden. Sobald die Zeit abgelaufen ist, müssen Sie diese Gesamtliste abrufen. Danach kommt wieder ein anderer Artikel, der mit einer neuen Liste beginnen muss.Erstellen eines Timers, wenn nicht bereits verfügbar - RXJS

Wie mache ich das in RxJS?

Antwort

0

Wenn ich Sie richtig verstanden habe, können Sie eine bufferToggle() und eine BehaviorSubject verwenden.

  1. Bitte beachte, dass ich die randomIntGenerator Multicast, die Ihre asynchrone Liste der Elemente sein würde.

  2. Sie können das Prädikat i > 5 geeignet, um Ihren Kontext zu manipulieren

  3. Die BehaviorSubject ‚s Zustand wird verwendet, um sicherzustellen, dass bufferToggle() nur einen Strom von Puffer erlaubt ist jederzeit zu verfolgen.


var Rx = require('rxjs'); 

let tap = new Rx.BehaviorSubject(false); 
tap.subscribe(i=>console.log(`tap...${(i? 'on' : 'off')}`)) 

let randomIntGenerator = Rx.Observable 
          .interval(1000) 
          .map(()=>getRandomInt(1 , 10)) 
          .share() 

randomIntGenerator 
    .do(i=>console.log('emits: ', i)) 
    .bufferToggle(
     randomIntGenerator, 
     (i)=>{ 
     if(i>5 && !tap.value){ 
      tap.next(true) 
      return Rx.Observable.interval(3000) 
     } 
     } 
    ) 
    .do(()=>tap.next(false)) 
    .subscribe(list=>console.log('#newlist -->', list)) 

function getRandomInt (min, max){ 
    //From MDN's Math,random() example 
    min = Math.ceil(min); 
    max = Math.floor(max); 
    return Math.floor(Math.random() * (max - min)) + min; 
    } 

Siehe die Live-Umsetzung here

0

Dieser Code es für Sie tun:

console.clear() 

const getRandom =() => { 
    return Math.round(Math.random()*300,0) 
} 

const timer$ = Rx.Observable.interval(1000) // A stream of numbers 
.map(getRandom) 
// .do(console.log) // uncomment to see each number as it is generated 
.bufferTime(5000) 

const s = timer$.subscribe(val => console.log(val)); 

Dieser einen Timer und einen Zufallszahlengenerator verwendet ein bereitzustellen Reihe von Zufallszahlen. Diese werden für 5 Sekunden gepuffert und dann als Array zurückgegeben.

Der Prozess beginnt wieder eine Sekunde später als die nächste Nummer

A codepen kommt hier ist https://codepen.io/mikkel/pen/VyzEgb?editors=1001

Verwandte Themen