当前位置: 首页 > 面试题库 >

如何创建一个RxJS缓冲区来对NodeJS中的元素进行分组,但不依赖于永远的运行间隔?

孙嘉悦
2023-03-14
问题内容

我正在使用Rx.Observable.fromEventNodeJS中的应用程序捕获事件。这些使用请求(https://www.npmjs.com/package/request)发送到另一台服务器。为了避免高网络负载,我需要在发送的请求之间的给定超时时间内缓冲那些事件。

问题

使用bufferWithTime(200)将使节点进程保持运行,并且我不知道应用程序何时完成关闭流。

有什么方法可以使用Rx缓冲区说:

  1. 按下元素1时,设置一个计时器
  2. 当元素2和3在计时器到期之前到达时,将它们推入数组[1,2,3](缓冲区)
  3. 当计时器到期时,将[1、2、3]数组发送到管道下方。
  4. 如果元素4在计时器到期之后出现,则设置一个新计时器,然后重新开始。

如果没有推送任何元素,则不会启动任何计时器,这会使进程退出。

我最初的方法是:

Rx.Observable
     .fromEvent(eventEmitter, 'log')
     .bufferWithTime(200) // this is the issue
     .map(addEventsToRequestOption)
     .map(request)
     .flatMap(Promise.resolve)
     .subscribe(log('Response received'))

问题答案:

建议的实现,使用delay运算符:

function emits(who){
  return function (x) { console.log([who, "emits"].join(" ") + " " + x + " click(s)");};
}

var source = Rx.Observable.fromEvent(document.body, 'click');
console.log("running");

var delayedSource$ = source.delay(1200);

var buffered$ = source
     .buffer(function () { return  delayedSource$;}).map(function(clickBuffer){return clickBuffer.length;})

buffered$.subscribe(emits("buffer"));

jsbin在这里:http
://jsbin.com/wilurivehu/edit?html,js,console,output




 类似资料:
  • 问题内容: 我想在.net C#应用程序上使用数据缓存。到目前为止,我添加了数据缓存并在特定表上添加了SQL缓存依赖项。但这还不够。这些表将被过于频繁地更新,但是与许多缓存的对象无关。这将使数据缓存几乎无用,因为它将被频繁刷新。我想在每个对象的特定行上实现sql缓存依赖项。我怎样才能做到这一点? 问题答案: 您需要了解SqlDependency的工作方式。您订阅一个结果集,并在该结果集发生更改时得

  • 在其他语言中,此任务很简单,只需在Python中使用类似以下内容: 如果没有什么要处理的,我的程序也会想暂停执行。我不希望它用查询使数据库过载。 我正在尝试编写一个应用程序,它将充当后台队列处理器。它将检查数据库,看看队列中是否有任何需要处理的项目,然后该程序将数据写入磁盘上的文件。连接到同一数据库的不同系统的用户会间歇性地将数据添加到数据库中。 我认为永久npm模块不太合适,因为该模块只是检查脚

  • 问题内容: 和是先前已计算出的相同长度的NumPy向量,因此需要创建一个新向量。在它只是为了说明什么是想要的元素索引。 在这种情况下是否需要for循环? 问题答案: 您可能认为这会起作用: 但事实并非如此:您实际上无法以这种方式在numpy中进行递归(因为numpy计算了整个RHS,然后将其分配给LHS)。 因此,除非您可以提出该公式的非递归版本,否则您将陷入显式循环:

  • 问题内容: 有什么办法可以使这两个软件包一起运行? 因此,基本上,我希望两全其美。自动运行服务器(并在出现错误时重新启动),并在发生.js文件更改时自动更新。 问题答案: 但是要避免该问题,您可以执行以下操作: 这样可以确保实际退出(而不是给您“应用程序崩溃”消息),然后再次将其接收。 在此指定要运行的命令,否则将默认为节点。不使用-c会导致在此答案的注释中提及的错误。

  • 创建一组元素,根据原始数组中的位置进行分组。 使用 Math.max.apply() 获取参数中最长的数组。 创建一个长度为返回值的数组,并使用 Array.from() 和 map-function 来创建一个分组元素数组。 如果参数数组的长度不同,则在未找到值的情况下使用 undefined 。 const zip = (...arrays) => { const maxLength =

  • 问题内容: 我有一段代码,我不知道如何进行单元测试!该模块使用urllib2从外部XML提要(twitter,flickr,youtube等)中提取内容。这是一些伪代码: 我的第一个想法是腌制响应并加载它以进行测试,但是显然urllib的响应对象是不可序列化的(它引发了异常)。 仅从响应主体保存XML是不理想的,因为我的代码也使用标头信息。它旨在作用于响应对象。 当然,在单元测试中依赖外部数据源是