我有一个dojo方法来使xhrRequest从DB获取最新的项目列表,并使用setInterval()
定期执行。有没有其他更好的方法,如果没有使用setInterval()
,只要将新项目添加到数据库中就会自动更新内存存储?当前代码位于
<div data-dojo-type="dojo/store/Memory"
data-dojo-id="dataStore">
<script type="dojo/method">
var myStore = this;
setInterval(function(){
require(["dojo/request/xhr"], function(xhr){
xhr("myurl", {
handleAs: "json"
}).then(function(data){
if (data && data.length > 0) {
myStore.setData(data);
}
}, function(err){
// Handle the error condition
}, function(evt){
// Handle a progress event from the request if the
// browser supports XHR2
});
});
}, 2000);
</script>
</div>
答案 0 :(得分:1)
好吧,您可以使用dojo/store/JsonRest
代替dojo/store/Memory
。如果您确实需要更新信息,那么每次要获取数据时都应该调用"myurl"
,这样就不必轮询服务器进行更改。
如果您没有RESTful API,并且您不愿意实施自己的dojo/store
商店(也可能是这种情况),那么您可能需要考虑一下的WebSockets。
您的方法存在的问题是它非常耗费网络(当然,如果有很多客户端)。如果服务器可以将消息推送到客户端,说数据库已经更改并且他们必须更改其商店,那将更有意义。
这与Meteor等平台的工作方式类似,他们使用WebSockets将服务器端数据库(部分)同步到客户端商店。
但是,并非所有浏览器都支持WebSockets(caniuse.com),但大多数框架都提供了一个服务器+客户端组件,可以使用相同的回退(例如,长轮询)。
请查看Real-time Stores文章,该文章对此进行了详细解释。