我似乎无法在 rethinkdb 文档中找到任何有关如何在第一次更改触发之前停止更改源的信息。这是使这一点变得必要的问题:
客户端通过套接字连接到服务器,该套接字开始更改源,如下所示:
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()
当分派(dispatch)第一个更改时,我可以将游标分配给内存中的变量,如果客户端断开连接,则关闭该游标。
但是,如果用户在第一次更改之前断开连接怎么办?
据我所知,rethink 不支持向提要分派(dispatch)初始状态,因此光标仅在更改后才可用。但是,如果用户断开连接,则 changeCursors[user.id]
未定义,并且更改源将永远保持打开状态。
这可以通过检查更改源内的状态对象并在第一次更改后关闭源来解决,但理论上,如果没有更改并且有许多连接的客户端,我们可能会打开许多游标,这些游标将无缘无故地消耗内存原因(一旦更新就会关闭)。
有没有办法在不执行 run
回调的情况下从更改源获取光标?或者,有没有办法强制重新思考对 run
回调执行初始状态更新?
最佳答案
即使服务器立即响应,您也会遇到此问题,因为在您将查询发送到服务器之后、响应返回之前,用户可能会断开连接。不幸的是,我们无法在将查询发送到服务器之前创建游标,因为在一般情况下弄清楚查询的返回类型有点困难,因此我们不会将该逻辑放入客户端。
我认为最好的选择就是您所描述的,如果光标尚未返回,您可以设置一个标志并在回调内将其关闭。您也许可以使用 Promise 使逻辑更清晰。
我不会担心内存使用,除非你确定这是一个问题;如果一秒的某些部分没有发生变化,我们会向客户端返回一个没有初始值的游标,因此,在大量用户打开然后立即关闭连接的情况下,您的内存使用量将与有多少用户可以执行操作成正比那一秒的那部分。如果这部分时间对您来说太长,您可以使用 optargs to run
( http://rethinkdb.com/api/javascript/run/ ) 将其配置得更小。 (在您的情况下,我只是将 firstBatchScaledownFactor
设置得更高。)
关于node.js - 更改前关闭 RethinkDB 更改源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30444258/