Lor*_*ard 15 javascript polling long-polling websocket backbone.js
我需要找到一种方法来更新用它实现的Web应用程序backbone
.
用例如下:
我有几个视图,每个视图,或者与此视图相关的模型/集合,需要在不同的时间向服务器发出不同的轮询请求以发现一些更改.
我想知道最通用的方法是什么:
1)实现Traditional Polling Request
2)实现Long Polling Request
3)实现HTML5 web socket
PS:
1)服务器是用PHP编写的.
2)目前我正在寻找一种不使用HTML5 WebSockets的解决方案,因为使用PHP可能并不那么简单.
这是我的简单代码(1)使用Traditional Polling Request
.
(1)
// MyModel
var MyModel = Backbone.View.extend({
urlRoot: 'backendUrl'
});
// MyView
var MyView = Backbone.View.extend({
initialize: function () {
this.model = new MyModel();
this.model.fetch();
this.model.on('change', this.render);
setTimeout(function () {
this.model.fetch();
}, 1000 * 60 * 2); // in order to update the view each two minutes
}
});
Run Code Online (Sandbox Code Playgroud)
Dan*_*nda 18
在您的Model中实现它的轮询处理程序,请检查以下示例:
// MyModel
var MyModel = Backbone.Model.extend({
urlRoot: 'backendUrl',
//Add this to your model:
longPolling : false,
intervalMinutes : 2,
initialize : function(){
_.bindAll(this);
},
startLongPolling : function(intervalMinutes){
this.longPolling = true;
if( intervalMinutes ){
this.intervalMinutes = intervalMinutes;
}
this.executeLongPolling();
},
stopLongPolling : function(){
this.longPolling = false;
},
executeLongPolling : function(){
this.fetch({success : this.onFetch});
},
onFetch : function () {
if( this.longPolling ){
setTimeout(this.executeLongPolling, 1000 * 60 * this.intervalMinutes); // in order to update the view each N minutes
}
}
});
// MyView
var MyView = Backbone.View.extend({
initialize: function () {
this.model = new MyModel();
this.model.startLongPolling();
this.model.on('change', this.render);
}
});
Run Code Online (Sandbox Code Playgroud)
fre*_*ish 11
我不确定你在这里问什么,但这里有一些想法:
1)你的代码似乎与你在标题中写的内容相矛盾.使用setTimeout
(或setInterval
)进行连续轮询与长轮询不同.实际上这是一个(正常的)民意调查.不同之处在于,使用长轮询客户端启动AJAX请求并等待.服务器决定何时响应.它应该只在新数据可用时才响应.在响应客户端启动新的轮询请求后立即进行.
旁注:创建(相对)高效的长轮询服务器并不是一件容易的事,请注意这一点.
2)只要你知道你的代码内部发生了什么,你如何处理客户端(即你放置长轮询逻辑的地方)并不重要.当然要记住,将来你可能希望对代码进行一些更改,因此将它保持分离可能是最佳选择.这是我要选择的架构:
EventManager
对象的独立脚本(此脚本应作为第一个加载).这样的对象将有以下几种方法:.bind
和.trigger
它将,呃......管理事件.:)例如,实现可能如下所示:EventManager.trigger('long_polling_data', res);
.然后,您需要在骨干视图中或任何您喜欢的位置绑定到此事件.附注:此架构的另一个好处是,如果您决定切换到WebSockets或任何其他技术(例如:JSONP轮询),那么您只需要实现其他技术的逻辑.主代码仅使用long_polling_data
事件,因此不需要进行其他更改(您可能希望更改事件的名称:]).
3)虽然你说你不想使用WebSockets,但我必须对此发表评论.:)你知道世界在不断发展.你应该忘记长期的民意调查技巧.使用WebSockets和XMLSocket(也称为FlashSocket)作为后备更有效,并且实现服务器端要简单得多.
我希望我能帮助一下,抱歉任何语言错误,祝你的项目好运!