我有这个:
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)将所有内容延迟了几秒钟,然后一直运行它们。
有什么想法吗?
更新
根据Alex的答案澄清一下
我需要的是:
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)
这很好用,因为折叠过滤后的结果并从中顺序创建事件是自然的,非常具有描述性的,没有副作用。
培根非常棒
答案 0 :(得分:1)
除非您在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
答案 1 :(得分:1)
.delay(1000)将所有内容延迟到所有项目的秒数,然后一直运行它们。
是的,那就是delay
应该做的事情:接受每个事件并在给定的延迟后解雇它。
没有额外的功能可以同时延迟和缓冲,throttle
和debounce
都会吞下发生得太快的事件。
你能做的是:
Bacon.sequentially
可以传递1s-interval而不是普通Bacon.fromArray
来构建流使用zip
将您现有的事件流加入到预期时间发生的事件中:
Bacon.fromArray(bulk)….zip(Bacon.interval(1000), _.id)
我不确定你的.flatMap(isValInCouchDb)
如何操纵流。