отдельный поток событий кликов с минимальной задержкой между собой с помощью Rxjs - PullRequest
0 голосов
/ 13 мая 2018

У меня есть проблема, когда пользователь очень быстро нажимает на две кнопки, которые обновляют в базе данных Firebase тот же объект и то же свойство.проблема в том, что только один запрос сохраняет, а остальные переопределяют.Это происходит в том случае, если пользователь нажал на обе кнопки в одну и ту же секунду.

У меня вопрос, есть ли способ выполнить потоки кликов с минимальной задержкой между ними.Я хочу, чтобы между каждым исполнением было минимум 2 секунды.спасибо за помощь.

Я хочу записать все клики, но выполнить функциональность с минимальной задержкой между ними.

(function($){ 
    $(function($, undefined){
       var count = 0;
        const click$ = Rx.Observable.fromEvent($('.btn'), 'click').share();

        click$
            .map((ev)=> {
                count ++;
                return count;
            })
            .bufferTime(1000)
            .filter(buffer => buffer.length > 0)
             
            .do((buffer) => console.log(`new buffer: ${buffer}`))
            .map((buffer)=> {
              return  Rx.Observable.fromArray(buffer).concatMap(streams => Rx.Observable.of(streams).delay(2000))
            })
            .flatMap((s)=> s)
            .subscribe((a)=> {
                console.log(`${a} : ${new Date()}`)
            });
    });

})(jQuery);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button class="btn">Click</button>
</body>
</html>

Проблема в том, что я нажимаю несколько раз больше секунды.потоки из другого буфера будут выполняться одновременно.как я могу решить :( пример:

новый буфер: 1,2,3,4

новый буфер: 5,6,7,8,9,10

1: сб 12 мая 2018 17:22:29 GMT-0600 (MDT)

новый буфер: 11,12,13

5: сб 12 мая 2018 17:22:30 GMT-0600 (MDT)

2: сб. 12 мая 2018 17:22:31 GMT-0600 (MDT)

11: сб. 12 мая 2018 17:22:31 GMT-0600 (MDT)

2 и 11 произошли в одно и то же время. Как я могу это решить: (

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Как насчет этого, но обычно вы можете заменить функцию таймера на HTTP-вызов, вы не можете точно знать, сколько времени займет HTTP-вызов.

const click$ = Rx.Observable.fromEvent(btn, 'click')

click$.concatMap(e=>click$.concatMap(e=>Rx.Observable.timer(2000)))
.subscribe(a=> console.log(`${a} : ${new Date()}`));
0 голосов
/ 13 мая 2018

Вы можете сжать поток событий с интервалом, чтобы связать каждое излучение с интервалом.Исходные значения будут излучаться с задержкой не менее 2с между излучениями:

const source$ = Rx.Observable.from([1,2,3,4]);
const interval$ = Rx.Observable.interval(2000);
Rx.Observable.zip(source$, interval$)
  .map(([value, _index]) => value)
  .subscribe(console.log);
...