2016-07-29 10 views

Antwort

1

einfach.

Rx.Observable.fromEvent(window, 'mousemove') 
    .throttle(500) 
    .subscribe(x => console.log(x)); 

Es werden Ereignisse gedrosselt, sodass nur ein Ereignis während eines einzelnen 500-Millisekunden-Fensters durchkommen kann.

+0

geschätzt. Ich wollte nur eine Klarstellung. Rx.Observables.fromEvent wird auf Ereignisse warten (wie Maus hier). Was Wenn ich nicht auf ein Ereignis warten möchte, möchte ich nur eine Funktion drosseln? Ich hoffe meine Frage ist gültig. Wenn nicht freundlich helfen. Wie gesagt ich möchte das Verhalten der folgenden Funktion nachahmen. _.throttle (Funktionsname, Zeitspanne, {trailing: true/false}) –

+0

Sie können eine Lösung als die andere Antwort hacken, aber es ist nicht wirklich eine "Rx" -Lösung. Meine Frage wäre, warum muss es eine Funktion sein? Was ruft diese Funktion auf? Normalerweise mit Rx ist die Idee, mit der Quelle zu beginnen und die Pipeline um die gesamte Aufgabe zu bauen. – paulpdaniels

0

Werfen Sie einen Blick auf sample Operator in RxJs

Hier einfaches Beispiel mit mousemove- Ereignisse auf div ist.

const source = document.getElementById('source'); 
 

 
Rx.Observable 
 
    .fromEvent(source, 'mousemove') 
 
    .sample(1000) 
 
    .map(event => ({x: event.offsetX, y: event.offsetY})) 
 
    .subscribe(console.log);
#source { 
 
    width: 400px; 
 
    height: 400px; 
 
    background-color: grey; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script> 
 

 
<div id="source"></div>

Wenn Sie Drossel mit RxJS implementieren möchten Sie, dass wie dies tun können:

verwenden, um die throttle Betreiber

function throttle(fn, delay) { 
 
    const subject = new Rx.Subject(); 
 
    
 
    subject 
 
    .sample(delay) 
 
    .subscribe(args => fn(...args)); 
 
    
 
    return (...args) => subject.onNext(args); 
 
} 
 

 
const sourceBtn = document.getElementById('source'); 
 
const countSpan = document.getElementById('count'); 
 
let count = 0; 
 

 
sourceBtn.addEventListener('click', throttle(() => { 
 
    count++; 
 
               
 
    countSpan.innerHTML = count; 
 
}, 1000));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script> 
 

 
<button id="source" type="button">click</button> <br> 
 
count = <span id="count"></span>

+0

geschätzt. Aber gibt es irgendeine Methode, die wie fromEvent eine andere Methode als Eingabe verwendet und sie mit einer anderen Methode drosselt, sagen wir mal Probe? –

+0

@PushkarKathuria Ich bekomme nicht wirklich, was Sie wollen, aber ich habe meine Antwort bearbeitet, so dass Sie sehen können, Drosselung der von Unterstreichung implementieren mit RxJs. Es löst jede Sekunde eine Funktion aus, wenn ein Klick erfolgte. – sielakos

+0

Funktioniert es nur mit Ereignissen? Entschuldigung, wenn es sich dumm anhört. Aber die Aufgabe, die ich ausführen muss, besteht darin, einen Funktionsaufruf zu drosseln. Dasselbe, was diese folgende Zeile tut: - _.throttle (Funktion, Zeitspanne, {trailing: true/false}) Die obige Zeile wird eine Funktion für eine bestimmte Zeitspanne drosseln und danach aufrufen. Ich hoffe, ich kann das Problem klären? –