【发布时间】:2015-05-25 18:39:19
【问题描述】:
我似乎在 rethinkdb 文档中找不到任何关于如何在第一次更改被触发之前停止 changefeed 的信息。这是使这变得必要的问题:
客户端通过套接字连接到服务器,该套接字开始一个 changefeed,如下所示:
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()
当第一次更改被调度时,我可以将游标分配给内存中的一个变量,如果客户端断开连接,关闭这个游标。
但是,如果用户在第一次更改之前断开连接怎么办?
据我所知,rethink 不支持向提要发送初始状态,因此光标仅在更改后可用。但是,如果用户断开连接,changeCursors[user.id] 是未定义的,并且 changefeed 将永远保持打开状态。
这可以通过检查 changefeed 中的 state 对象并在第一次更改后关闭 feed 来解决,但理论上如果没有更改且连接的客户端很多,我们可能会打开许多游标,这些游标会占用内存原因(它们将在更新后立即关闭)。
有没有办法在不执行run 回调的情况下从变更提要中获取光标?或者,有没有办法强制重新考虑对run 回调执行初始状态更新?
【问题讨论】:
-
谢谢你提出这个问题——我只是在谷歌上搜索如何关闭更改光标,你的代码告诉我——我很好奇,因为我在文档中没有找到它,你在哪里找到 cursor.close() ?另外 - 维护每个用户/连接的游标数组的想法非常好,我现在也使用了它的变体。再次感谢。