Dojo dgrid + WebSocket 通知导致应用程序无响应
Dojo dgrid + WebSocket notifications causing application to become unresponsive
在我的应用程序中,我使用 OnDemandGrid
,由 Request + Trackable dstore 支持,向用户显示我的数据。
服务器通过websocket 向客户端发送通知以将新条目添加到网格中。为了将新条目添加到网格,商店发出了一个 'add' 事件,类似于以下代码:
function _emitAddEvent(store, entity) {
store.emit('add', {
target: entity,
id: entity.id
});
}
到这里为止,一切都很好。应用程序从服务器接收要添加到网格的新条目,并添加它(不刷新网格)。问题是如果服务器在一个小的时间间隔内发送了太多的通知。商店将所有事件发送到 dgrid,但网格需要一些时间来呈现所有行。因为要添加的条目太多,所以应用程序没有响应。如果服务器停止向客户端发送数据,一段时间后应用程序会恢复并正确呈现所有行。现在是第二个(但次要的)问题。
第二个问题是,网格在渲染完所有新行后,并没有销毁太远的行。我已经设置了 farOffRemoval
属性,但它似乎只处理发生滚动和向服务器请求新数据的情况。我想知道是否有不依赖滚动的解决方法来销毁距离用户当前位置太远的节点。
好吧,我已经设法编写了第一个问题的解决方法。由于应用程序变得无响应,因为客户端在短时间内收到了很多通知,我选择将事件添加到队列中并以每秒最多一个的速度发出它们。 dojo/throttle
和 setInterval 就足够了。
第二个问题,与 farOffRemoval
属性有关,我无法解决。经过一些测试,我注意到浏览器可以有很多 DOM 个节点而不会损失显着的性能(当然,这取决于用户机器),所以我只保留网格不变。
在我的应用程序中,我使用 OnDemandGrid
,由 Request + Trackable dstore 支持,向用户显示我的数据。
服务器通过websocket 向客户端发送通知以将新条目添加到网格中。为了将新条目添加到网格,商店发出了一个 'add' 事件,类似于以下代码:
function _emitAddEvent(store, entity) {
store.emit('add', {
target: entity,
id: entity.id
});
}
到这里为止,一切都很好。应用程序从服务器接收要添加到网格的新条目,并添加它(不刷新网格)。问题是如果服务器在一个小的时间间隔内发送了太多的通知。商店将所有事件发送到 dgrid,但网格需要一些时间来呈现所有行。因为要添加的条目太多,所以应用程序没有响应。如果服务器停止向客户端发送数据,一段时间后应用程序会恢复并正确呈现所有行。现在是第二个(但次要的)问题。
第二个问题是,网格在渲染完所有新行后,并没有销毁太远的行。我已经设置了 farOffRemoval
属性,但它似乎只处理发生滚动和向服务器请求新数据的情况。我想知道是否有不依赖滚动的解决方法来销毁距离用户当前位置太远的节点。
好吧,我已经设法编写了第一个问题的解决方法。由于应用程序变得无响应,因为客户端在短时间内收到了很多通知,我选择将事件添加到队列中并以每秒最多一个的速度发出它们。 dojo/throttle
和 setInterval 就足够了。
第二个问题,与 farOffRemoval
属性有关,我无法解决。经过一些测试,我注意到浏览器可以有很多 DOM 个节点而不会损失显着的性能(当然,这取决于用户机器),所以我只保留网格不变。