我似乎无法在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()
当调度第一个更改时,我可以将光标分配给内存中的变量,如果客户端断开连接,请关闭此光标。
但是,如果用户在第一次更改之前断开连接怎么办?
据我所知,重新思考并不支持向源调度初始状态,因此光标只有在更改后才可用。但是,如果用户断开连接,则changeCursors[user.id]
未定义,并且更改源将永久保持打开状态。
这可以通过检查更改源内的状态对象并在第一次更改后关闭源来解决,但理论上如果没有更改和许多连接的客户端,我们可能会打开许多会占用内存的游标原因(他们会在更新后立即关闭。)
有没有办法在没有执行run
回调的情况下从更改源获取光标?或者,有没有办法强制重新考虑对run
回调执行初始状态更新?
答案 0 :(得分:1)
即使服务器立即响应,您也会遇到此问题,因为用户可能会在您将查询发送到服务器之后以及在响应恢复之前断开连接。遗憾的是,我们无法在将查询发送到服务器之前创建游标,因为在一般情况下确定查询的返回类型有点困难,因此我们不会将该逻辑放在客户端中。 / p>
我认为最好的选择是你所描述的,如果光标还没有返回,你设置一个标志并在回调中关闭它。您可以使用promises使逻辑更清晰。
除非你确定它是一个问题,否则我不担心内存使用情况;如果一秒钟的某些部分没有更改,我们将没有初始值的游标返回给客户端,因此在许多用户打开的情况下使用内存,然后立即关闭连接将与用户可以执行的操作数量成正比在那一部分中。如果那部分时间对你来说太长,你可以将其配置为更小,使用run
firstBatchScaledownFactor
(http://rethinkdb.com/api/javascript/run/)的optargs。 (我会在你的情况下将app.controller('testCtrl', function($scope){
$scope.getData = function(){
//getDataFunc is a method in a Factory, which is not shown here
$scope.results = getDataFunc();
}
}
app.directive('testDir', function(){
return{
restrict: 'AE',
scope: {
resultData: '='
},
controller:['$scope', function($scope){
//I need to be able to access the $scope.results from the parent controller
}
}
}
设置得更高。)