/**
* Created by darius on 02/04/16.
*/
import { Component } from 'angular2/core';
import { Observable } from 'rxjs/Rx';
@Component({
styles: [ require('../../style.css') ],
selector: 'keypresses-per-second',
template: `
<div class="block">
<input type="text" (keypress)="onKeypress($event)">
{{keypresses}} <br>
<input type="text" (keypress)="onKeypressReact($event)">
{{keypressesReactive}}
</div>
`
})
export class KeypressesPerSecond {
ngOnInit() {
this.nonReactive();
this.reactiveWay();
}
// not reactive
keypresses = '';
counter = 0;
secondsPassed = 0;
nonReactive(){
var self = this;
var int = setInterval(function(){
console.log(self.counter, 'counter in non reactive')
self.keypresses += self.counter + ', ';
self.counter = 0;
self.secondsPassed++
if (self.secondsPassed > 30) {
clearInterval(int);
}
}, 1000);
}
onKeypress($event){
console.log($event.keyCode);
this.counter++;
}
// end not reactive
onKeypressReact() {}
keypressesReactive = '';
reactiveCount = 0;
reactiveWay() {
console.log('reactive way')
const keypressObservable$ = Observable.create(observer => {
// from template
this.onKeypressReact =() => { observer.next('press'); };
});
keypressObservable$.subscribe(function(event) {
self.reactiveCount++;
});
var self = this;
var timer$ = Observable.create(function(observer){
// is subscribed to this observable
var subscribed = true;
var int = setInterval(function() {
if (subscribed) {
observer.next(self.reactiveCount);
self.reactiveCount = 0;
}
if (self.secondsPassed > 30) {
observer.complete();
clearInterval(int)
}
}, 1000);
})
timer$.subscribe(
function (x) {
console.log('Nextzz: %s', x);
self.keypressesReactive += x + ', ';
});
}
}
Ich habe versucht, reaktive und nicht reaktive Art der Tasten drücken Zähler. Werfen Sie einen Blick auf die Funktion reactiveWay()Zählen Tasten drücken pro Sekunde mit Winkel 2 Rxjs
es funktioniert, aber ich denke, es könnte etwas nicht stimmen.
ich excersizes es getan in http://reactivex.io/learnrx/
und es gab viele Mapping.
Es fühlt sich an, als ob ich das Zeitereignis auf die Reihenfolge der Schlüsselereignisse pro Sekunde abbilden müsste. Aber verstehe nicht, wie ich diese abbilden könnte.
So etwas wie
// doing this way we could removed some code from timer$, we just need to get an event
var kps$ = timer$.concatMap(function(time) {
var sum = keypressObservable$.takeUntil(timer$)
.reduce(function (acc, cur) {
return acc + cur;
})
console.log('sum', sum);
return sum;
})
// this works, counts the keypresses, but only when pressing at least 1.
kps$.subscribe(
function (x) {
console.log('kps next', x);
self.keypressesReactive += x + ', ';
});
Wie erzwinge ich kps $ 0 Summe ausgegeben wird, wenn keine Taste gedrückt wird in der zweiten getan, wenn ich die kps $ verwenden?
aktualisieren
Basierend auf der Antwort, ich habe dies getan.
Aber wenn ich die Obs abonniere, bekomme ich kein Ereignis jede Sekunde mit 0 Wert noch. Wenn ich einige Tasten in einer Sekunde drücke, bekomme ich die Anzahl der Tasten gedrückt und ein weiteres Ereignis von 0. Und dann hören die Ereignisse auf, bis ich wieder die Tasten drücke. Was muss ich ändern, damit ich jede Sekunde ein Ereignis erhalte?
Ist für mich nicht funktioniert, zumindest in RxJs 5 - immer Fehler: Fehler: (161, 15) TS2345 : Das Argument des Typs '() => Observable <{}>' kann nicht dem Parameter 'Observable' zugewiesen werden. Die Eigenschaft '_isScalar' fehlt im Typ '() => Observable <{}>'. –
Es wurde herausgefunden, wie der Fehler behoben werden kann - delayedSource an die Pufferfunktion übergeben. Aber es funktioniert immer noch nicht wie ich will –
Sie haben Recht. Sie sollten den Operator Pufferzeit verwenden. Ich habe meine Antwort entsprechend aktualisiert ... –