Кажется, я не могу найти информацию в документах rethinkdb о том, как вы могли бы остановить изменение, до того как будут произведены первые изменения. Вот проблема, что делает это необходимым:close 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()
Когда первое изменение отправляется, я могу назначить курсор к переменной в памяти, и если клиент отключается, закройте этот курсор.
Однако, что, если пользователь отключается до первого изменения?
Насколько я могу судить, переосмысление не поддерживает отправку исходного состояния в канал, поэтому курсор будет доступен только после изменения. Однако, если пользователь отключается, changeCursors[user.id]
не определен, а смена возвращается навсегда.
Это можно решить, проверив объект состояния внутри файла changefeed и просто закрыв фид после первого изменения, но теоретически, если нет изменений и много подключенных клиентов, мы можем потенциально открыть много курсоров, которые будут использовать память для нет причин (они будут закрыты, как только они будут обновлены).
Есть ли способ получить курсор из смены без выполнения run
обратного вызова? Альтернативно, есть ли способ заставить переосмыслить выполнение первоначального обновления состояния для обратного вызова run
?
Благодарим вас за этот вопрос - я просто искал для себя, как закрыть курсор изменения, и ваш код показал мне это - мне любопытно, потому что Я не нашел его в документах, где вы нашли cursor.close() ?? Кроме того, идея сохранения массива курсоров для каждого пользователя/соединения превосходна, и теперь я использовал вариацию. Еще раз спасибо. – kris
Вот он: https://rethinkdb.com/api/javascript/#close-cursor – Vincent