我需要找到一种方法来更新网络应用与实施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
}
});
实现它在模型中的轮询处理程序,检查这个例子:
// 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);
}
});
我不知道你问什么在这里,但这里的一些想法:
1)您的代码似乎违背你写的标题是什么。 使用setTimeout
(或setInterval
)连续轮询是不同的东西,然后长轮询。 其实这是一个(正常)查询。 不同的是,与长轮询客户端启动一个AJAX请求和他等待。 服务器决定何时作出回应。 它应该只有当新的数据是可用的响应。 和响应客户端启动一个新的轮询请求后,立刻。
附注 :创建(相对)高效长轮询服务器不是一件容易的事,要意识到这一点。
真正的问题,只要你知道这是怎么回事你的代码中2),你如何处理客户端(即你把长轮询逻辑)没有。 当然,要记住,也许在未来,你想作一些修改代码,因此保持它分开可能会是一个最好的选择。 下面是我会选择的架构:
- 独立脚本,创建全球
EventManager
对象(此脚本应该加载的第一个)。 这样的对象将有以下几种方法: .bind
和.trigger
,它会,呃......管理事件。 :)下面是例如实现可能什么样子:
实现我自己的对象事件
- 独立脚本处理长轮询。 每当数据被从所述服务器接收(即,AJAX长轮询请求终于结束)它调用
EventManager.trigger('long_polling_data', res);
。 然后,你需要绑定到该事件的骨干视图或任何你喜欢里面。
附注 :此体系结构的其他好处是,如果你决定要切换到的WebSockets或任何其他技术(例如:JSONP轮询),那么你将只需要实现对其他技术的逻辑。 主要的代码将只使用long_polling_data
事件,所以没有进一步变化将需要(您可能要改变事件的名称:])。
3)虽然你说你不想使用WebSockets我对此发表评论。 :)你知道,世界是不断变化的。 你应该忘掉长轮询techniquesl。 使用的WebSockets和的XMLSocket(又名FlashSocket)作为后备更加高效,这是一个很大simplier实现服务器端。
我希望我帮一点,对不起任何语言错误,好运与您的项目!
我知道你在你的问题,你不希望使用的PHP的WebSockets(由于它是不是那么简单)的状态,但是,我发现它是相对简单的。
- 我用http://pusher.com/它是一个网络插座应用与回退。 (我不是的方式与本公司)。
- 包括https://github.com/squeeks/Pusher-PHP在服务器/ API
- 包括
<script src="http://js.pusherapp.com/1.12/pusher.min.js"></script>
在客户端。
客户端和服务器的信道可以被设置相互使用网络套接字来说话。