Javascript 用于更新主干模型/视图的轮询请求
我需要找到一种方法来更新用Javascript 用于更新主干模型/视图的轮询请求,javascript,backbone.js,websocket,long-polling,polling,Javascript,Backbone.js,Websocket,Long Polling,Polling,我需要找到一种方法来更新用主干网实现的web应用程序 用例如下: 我有几个视图,每个视图,或者可能是与此视图相关的模型/集合, 需要在不同的时间向服务器发出不同的轮询请求以发现某些更改 我想知道最普遍的方法是什么: 1) 执行传统轮询请求 2) 执行长轮询请求 3) 实现HTML5 web套接字 附言: 1) 服务器是用PHP编写的。 2) 目前,我正在寻找一种不使用HTML5WebSockets的解决方案,因为使用PHP可能不是那么简单 下面是我使用传统轮询请求的简单代码(1) (一) 我
主干网实现的web应用程序
用例如下:
我有几个视图,每个视图,或者可能是与此视图相关的模型/集合,
需要在不同的时间向服务器发出不同的轮询请求以发现某些更改
我想知道最普遍的方法是什么:
1) 执行传统轮询请求
2) 执行长轮询请求
3) 实现HTML5 web套接字
附言:
1) 服务器是用PHP编写的。
2) 目前,我正在寻找一种不使用HTML5WebSockets的解决方案,因为使用PHP可能不是那么简单
下面是我使用
传统轮询请求的简单代码(1)
(一)
我不知道你在问什么,但这里有一些想法:
1)您的代码似乎与您在标题中所写的内容相矛盾。使用setTimeout
(或setInterval
)进行连续轮询与长轮询不同。实际上这是一个(正常的)投票。不同之处在于,对于长轮询,客户端启动AJAX请求并等待。服务器决定何时响应。而且它应该只在新数据可用时才做出响应。并且在响应客户端启动新的轮询请求后立即执行
旁注:创建(相对)高效的长轮询服务器不是一项容易的任务,请注意这一点
2)只要您知道代码内部发生了什么,如何处理客户端(即在何处放置长轮询逻辑)实际上并不重要。当然,请记住,也许将来您希望对代码进行一些更改,因此将其分开可能是最佳选择。以下是我将选择的体系结构:
- 创建全局
EventManager
对象的独立脚本(此脚本应作为第一个脚本加载)。这样的对象将具有以下方法:.bind
和.trigger
,它将。。。管理事件。:)以下是实施的示例:
- 处理长轮询的独立脚本。无论何时从服务器接收到数据(即AJAX长轮询请求最终结束),它都会调用
EventManager.trigger('long\u polling\u data',res)代码>。然后,您需要在主干视图内或任何您喜欢的地方绑定到该事件
旁注:这种架构的额外好处是,如果您决定切换到WebSocket或任何其他技术(例如:JSONP轮询),那么您只需要实现其他技术的逻辑。主代码将只使用long\u polling\u data
事件,因此不需要进行其他更改(您可能希望更改事件的名称:)
3)虽然你说你不想使用WebSocket,但我必须对此发表评论。:)你们知道这个世界在不断地进化。你应该忘记长轮询技术。使用WebSockets和XMLSocket(又称FlashSocket)作为后备方案更有效,实现服务器端也更简单
我希望我能帮上一点忙,为语言错误感到抱歉,祝你的项目好运 在您的模型中实现轮询处理程序,检查以下示例:
// 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);
}
});
我知道您在问题中表示不希望将WebSocket与php一起使用(因为它不是那么简单),但是,我发现它相对简单
我使用了一个带有回退功能的web套接字应用程序。(顺便说一句,我与公司无关)
包括在服务器/api上
在客户端包含
客户机和服务器频道可以设置为使用web套接字相互对话。感谢您的回复。我确实将我的问题的标题从长轮询改为传统轮询。我添加了关于我的问题的更多细节。也许它可以帮助你给我更多关于如何使用webSocket的信息。谢谢。对不起,我不是PHP开发人员,我不能帮你。除非您愿意学习Python或服务器端JavaScript.:]现在回想起来,对于没有经验的开发人员来说,实现长轮询和/或WebSocket可能有点困难。如果您不会发出很多请求,那么正常的轮询也应该可以工作。这很容易实现,只需使用setTimeout
。如果您了解asp.net,您可以查看SignalR,它使客户机-服务器交互非常容易,并且它会根据php中的浏览器功能SwebSocket自动选择适当的连接模型。旧代码,作者称之为快速黑客。。。还是值得一看的。php中的websocket更有希望:感谢您的回复。pusher php看起来很有趣。pusher php看起来很有趣,但我必须为此付费!!即使绑定this.model.on('change',this.render'),作用域也不明确//不明确的作用域——我的案例是models作用域this.model.on('change',this.render,this)//范围view@hharnisc这不是含糊不清的,因为我在初始化“u.bindAll(this);”时使用了这个词。这实际上是长轮询,还是您只是在使用那个词?我的理解是,在长时间轮询中,您打开到服务器的单个连接并等待响应。这看起来像是在不断地进行轮询。@Ziggy您对技术的定义不好。“打开单个连接”技术称为“推送技术”。长轮询请求“模拟”了“推送技术”,适用于无法使用套接字连接(由推送使用)的情况。长轮询请求模拟它在任何给定时间向服务器询问有关更新的信息。对于客户端,代码是相同的。正常轮询和长轮询之间的区别在于服务器代码。投票和投票的区别
// 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);
}
});