closuresRethinkDB改变之前改变

我似乎无法在rethinkdb文档中find关于在第一次更改被触发之前如何停止更改更改的信息。 这是使这个必要的问题:

客户端通过套接字连接到服务器,套接字开始换货,如下所示:

var changeCursors = {}; db('app').table('things').changes().run(cursor, function(err, cursor) { // do something when changed changeCursors[user.id] = cursor }) // later, when the user disconnects changeCursors[user.id].close() 

当第一次更改发送时,我可以将光标指定给内存中的一个variables,如果客户端断开,请closures此光标。

但是,如果用户在首次更改之前断开连接,该怎么办?

据我所知,反思不支持调度初始状态,所以光标只有在更改后才可用。 但是,如果用户断开连接,则changeCursors[user.id]是不确定的,并且换货始终处于打开状态。

这可以通过检查换货内部的一个状态对象来解决,并且在第一次改变之后closuresfeed,但是理论上如果没有改变和许多连接的客户端,我们可能会打开很多没有理由吃掉内存的游标将会在更新后立即closures)。

有没有办法让runcallback正在执行的变更饲料的光标? 另外,是否有办法强制重新执行runcallback的初始状态更新?

即使服务器立即作出响应,也会遇到此问题,因为用户可能在将查询发送到服务器之后并在响应返回之前断开连接。 不幸的是,在将查询发送到服务器之前,我们不能创build游标,因为在一般情况下,计算查询的返回types是困难的,所以我们不把这个逻辑放在客户端。

我认为最好的select是你所描述的,如果光标还没有返回,你设置一个标志,并在callback中closures它。 您可以使用promise来使逻辑更清洁。

除非您确定这是一个问题,否则我不会担心内存使用情况。 如果一秒钟的某个部分没有改变,我们返回一个没有初始值的光标给客户端,所以你的内存使用在很多用户打开的情况下,然后立即closures连接将与多less用户可以做的在那一秒的那一部分。 如果这部分时间太长,您可以将其configuration为使用optargs更小( http://rethinkdb.com/api/javascript/run/ )。 (我只是设置firstBatchScaledownFactor在你的情况更高。)