使用 Rxjs 通过彼此之间的最小延迟来分离点击事件流
separate stream of click events by minimum delay between each other with Rxjs
当用户非常快速地点击两个在 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:2018 年 5 月 12 日星期六 17:22:29 GMT-0600(MDT)
新缓冲区:11,12,13
5:2018 年 5 月 12 日星期六 17:22:30 GMT-0600(MDT)
2:2018 年 5 月 12 日星期六 17:22:31 GMT-0600(MDT)
11:2018 年 5 月 12 日,星期六 17:22:31 GMT-0600(MDT)
2和11同时发生。我该如何解决:(
您可以使用间隔流压缩事件流,以将每个发射与间隔相结合。源值将以 至少 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);
这个怎么样,不过一般你可以用http调用代替timer函数,你不能确定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()}`));
当用户非常快速地点击两个在 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:2018 年 5 月 12 日星期六 17:22:29 GMT-0600(MDT)
新缓冲区:11,12,13
5:2018 年 5 月 12 日星期六 17:22:30 GMT-0600(MDT)
2:2018 年 5 月 12 日星期六 17:22:31 GMT-0600(MDT)
11:2018 年 5 月 12 日,星期六 17:22:31 GMT-0600(MDT)
2和11同时发生。我该如何解决:(
您可以使用间隔流压缩事件流,以将每个发射与间隔相结合。源值将以 至少 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);
这个怎么样,不过一般你可以用http调用代替timer函数,你不能确定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()}`));