繁体   English   中英

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

[英]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 :处理每个事件并在给定延迟后将其触发。

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

您可以做的是:

  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM