[英]Bacon.js, delay each value in the stream by 1 second
我有这个:
var bulk = array[1,2,3,4]
var finalResult = Bacon
.fromArray(bulk)
.flatMap(isValInCouchDb)
.filter(onesThatExist)
.flatMap(putValInCouchDb)
我需要紧接过滤器之后才能将整个流延迟1秒,然后运行putValInCouchDb确实像这样:
var bulk = array[1,2,3,4]
var finalResult = Bacon
.fromArray(bulk)
.flatMap(isValInCouchDb)
.filter(onesThatExist)
.delay(1000)
.flatMap(putValInCouchDb)
但是我想我丢失了一些东西,因为.delay(1000)将所有内容延迟了多少秒,然后在所有时间过去之后将其全部运行。
有任何想法吗 ?
更新
只是根据亚历克斯的答案进行澄清
我需要的是:
1 "filter" 1
2 "filter" 2
3 "filter" 3
4 "filter" 4
[waits 1 second]
1004 "flatMap" 1
[waits 1 second]
2004 "flatMap" 2
[waits 1 second]
3005 "flatMap" 3
[waits 1 second]
4006 "flatMap" 4
更新2-使用解决方案
从Bergi的答案来看,使用带有间隔的.zip实际上是可行的,但是.zip发生的事情是.interval每秒创建一个事件,然后.interval中的每个事件都等待数据库检查中的每个事件。 许多数据库检查都是大量且非常快速地进行的,因此会发生“过度缓冲”(这是培根文档警告您的内容)。
因此,我决定以这种方式进行操作:
var bulk = array[1,2,3,4]
var finalResult = Bacon
.fromArray(bulk)
.flatMap(isValInCouchDb)
.filter(onesThatExist)
.fold([], function(a, b){ a.push(b); return a })
.flatMap(function(a){return Bacon.sequentially(1500, a)})
.flatMap(putValInCouchDb)
这很有效,因为折叠过滤后的结果并从中顺序创建事件是自然的,非常具有描述性的,并且没有副作用。
培根很棒
除非您在putValInCouchDb
中做一些花哨的东西, putValInCouchDb
您的代码似乎可以按照您希望的那样正常工作。 例如,跑步
var t = new Date().getTime();
function timestamp(label, x) { console.log(new Date().getTime() - t, label, x); }
var s = Bacon.fromArray([1,2,3,4])
.filter(function(x) { timestamp("filter", x); return true })
.delay(1000)
.flatMap(function(x) { timestamp("flatMap", x); return Bacon.constant(x) })
s.onValue(function(x) {})
输出类似
1 "filter" 1
2 "filter" 2
3 "filter" 3
4 "filter" 4
[waits 1 second]
1004 "flatMap" 1
1004 "flatMap" 2
1005 "flatMap" 3
1006 "flatMap" 4
.delay(1000)会将所有内容延迟多少秒,然后在所有时间过去之后将其全部运行。
是的,这就是应该执行的delay
:处理每个事件并在给定延迟后将其触发。
没有额外的功能可以同时进行延迟和缓冲, throttle
和debounce
会吞噬发生得太快的事件。
您可以做的是:
Bacon.sequentially
使用Bacon.sequentially
。,您可以传递1s间隔,而不是普通的Bacon.fromArray
来构造流 使用zip
将现有事件流加入到在预期时间发生的事件:
Bacon.fromArray(bulk)….zip(Bacon.interval(1000), _.id)
我不确定您的.flatMap(isValInCouchDb)
如何操纵流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.