Bacon.js,将流中的每个值延迟1秒

时间:2014-04-12 06:38:17

标签: javascript node.js bacon.js

我有这个:

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)

这很好用,因为折叠过滤后的结果并从中顺序创建事件是自然的,非常具有描述性的,没有副作用。

培根非常棒

2 个答案:

答案 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应该做的事情:接受每个事件并在给定的延迟后解雇它。

没有额外的功能可以同时延迟和缓冲,throttledebounce都会吞下发生得太快的事件。

你能做的是:

  • 使用Bacon.sequentially可以传递1s-interval而不是普通Bacon.fromArray来构建流
  • 使用zip将您现有的事件流加入到预期时间发生的事件中:

    Bacon.fromArray(bulk)….zip(Bacon.interval(1000), _.id)
    

我不确定你的.flatMap(isValInCouchDb)如何操纵流。