2016-07-29 5 views
0

Я новичок в Rxjs Observables, и мне нужно реализовать дросселирование с использованием Rxjs.Реализация _.throttle с использованием наблюдаемых значений RXJS

В подчеркивании мы делаем это с помощью следующей строки -

_.throttle(functionName, timespan, {trailing : true/false}). 

Просьбы помочь, как сделать это с наблюдаемыми.

ответ

1

Просто используйте оператор throttle.

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

Он будет дросселировать события так, чтобы в течение одного 500 миллисекундного окна могло проходить только одно событие.

+0

Оценка. Просто хотел уточнить. Rx.Observables.fromEvent будет прослушивать событие (например, здесь mousemove). Что делать, если я не хочу слушать событие, я просто хочу активировать функцию? Надеюсь, мой вопрос верен. Если не любезно помогите. Как я уже сказал, я хочу подражать поведению следующей функцией. _.throttle (functionName, timespan, {trailing: true/false}) –

+0

Вы можете взломать решение в качестве другого ответного ответа, но это не действительно «Rx» решение. Мой вопрос в том, почему это должна быть функция? Что называется этой функцией? Обычно с Rx идея состоит в том, чтобы начать с источника и построить трубопровод вокруг всей задачи. – paulpdaniels

0

Посмотрите на sample оператора в RxJs

Вот простой пример с MouseMove событием на дел.

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>

Если вы хотите реализовать дроссельных с помощью RxJS вы можете сделать это так:

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

Оценка. Но есть ли какой-либо метод, подобный fromEvent, который принимает другой метод в качестве ввода и дросселирует его с помощью какого-либо другого метода, скажем, образец? –

+0

@PushkarKathuria Я действительно не получаю то, что вы хотите, но я отредактировал свой ответ, чтобы вы могли видеть дроссельную симларную систему с помощью подчеркивания с помощью RxJs. Он срабатывает каждую секунду, если был щелчок. – sielakos

+0

Работает ли он только с событиями? Извиняюсь, если это звучит глупо. Но задача, которую мне нужно выполнить, - просто отключить вызов функции. То же самое, что и в следующей строке: _.throttle (function, timespan, {trailing: true/false}) Вышеприведенная строка будет дросселировать функцию для определенного промежутка времени и вызвать ее после. Надеюсь, я смогу прояснить проблему? –