Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Bacon.js,将流中的每个值延迟1秒_Javascript_Node.js_Bacon.js - Fatal编程技术网

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

Javascript Bacon.js,将流中的每个值延迟1秒,javascript,node.js,bacon.js,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 finalR

我有这个:

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)
但我想我遗漏了一些东西,因为延迟(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等待数据库检查中的每个事件。很多数据库检查都是批量进行的,而且速度非常快,因此会出现“过度缓冲”(bacon文档警告您这一点)

所以我决定这样做:

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
中做了一些花哨的事情,否则您的代码看起来会完全按照您希望的那样工作。例如,跑步

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)是指将所有项目延迟数秒,然后在所有时间过后运行所有项目

是的,这正是我们应该做的:接受每个事件并在给定的延迟后触发它

没有一个额外的函数可以同时延迟和缓冲,这两个函数都会吞噬发生得太快的事件

您可以做的是:

  • 使用它可以传递1s间隔,而不是普通的
    Bacon.fromArray
    来构造流
  • 用于将现有事件流加入在预期时间发生的事件:

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

我不确定您的
.flatMap(isValInCouchDb)
是如何操作流的。

我看到了混乱。所以我想要的是这样的:1“filter”12“filter”23“filter”34“filter”4[等待1秒]1004“flatMap”1[等待1秒]2004“flatMap”2[等待1秒]3005“flatMap”3[等待1秒]4006“flatMap”4最初是按顺序使用的,但我开始重构它,因为可以立即检查数据库中是否存在该项,但数据库中的插入必须在彼此之间等待一秒钟。另一方面,Zip看起来很有趣。问题可能是,如果检查发生得太慢,那么
interval
中的一系列事件可能已经累积,然后会快速连续执行。