这与couchdb-nano库的changesReader
API有关。
预期行为
我希望下面的代码等待10秒,然后从变更提要的最后一个位置返回一批消息。因此,如果我在10秒的超时时间内更新了DB 5次,我希望看到:10秒后“一批5个变更已到达”。
messages.changesReader
.start({ timeout: 10000 })
.on('batch', (batch) => {
console.log('a batch of', batch.length, 'changes has arrived');
}).on('error', (e) => {
console.error('error', e);
});
当前行为
现在的情况是没有批处理发生。每次我在超时内更新数据库时,我 * 立即 * 得到日志“一批1个更改已经到达”。
我是否错过了一些明显的东西,或者误解了nano的批处理工作原理?
1条答案
按热度按时间pbpqsu0x1#
nano没有问题。超简短的答案是使用
get
,但即使这样,你对timeout
的解释(看起来更像是暂停或积累)也是有缺陷的。考虑
start
的文档(start)通过重复的“长轮询”请求无限期地监听更改。此模式将无限期地轮询更改。
好的,这很清楚,
start
“无限期地”轮询。更改馈送请求等待数据的毫秒数
因此,当使用
start
时,timeout
* 不适用 *。是的,文档可能不那么令人费解。timeout
何时适用?(get)通过重复的“long poll”请求,监听更改,直到到达更改馈送的结尾。一旦接收到零更改的响应,“end”事件将指示更改的结尾,并且轮询将停止。
换句话说,如果X毫秒过去了,没有变化事件,
get
轮询以end
事件结束(也可能是spool
-我没有测试)。请考虑下面的节点脚本,它演示了
get
的行为。end
事件将在最后一个批处理事件激发10秒后发生。下面是一个输出示例
请注意,脚本在last事件后10秒(超时)结束。
如果将
get
替换为start
,则永远不会触发end
事件。更新
我认为有必要补充一点,即提要响应可能会因服务器和客户机的配置而异。例如,随后运行上面的脚本会产生紧凑的批处理响应: