我需要找到一种方法来更新用它实现的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)
我最近开始在我的iOS应用程序中使用PubNub,我很高兴.但是,我一直在寻找其他可用的选项,例如使用Websockets的Pusher和Realtime.co.另一方面,PubNub使用长轮询.我已经完成了自己的小速度比较,为了我的目的,我发现它们都足够快.
PubNub提供了一些很好的功能,如消息历史记录和频道中每个人的列表,所以除了我倾向于他们的其他一切.我的问题是,我应该关注电池寿命和使用像PubNub这样的长轮询解决方案的大量使用吗?Websockets解决方案是否会显着提高功效?
我进入了这些示例,显示了javascript中的轮询与长轮询,但我不明白它们之间的区别.特别是关于长轮询的例子,它如何保持连接打开?
这就是传统轮询方案的样子:
(function poll(){
setTimeout(function(){
$.ajax({ url: "server", success: function(data){
//Update your dashboard gauge
salesGauge.setValue(data.value);
//Setup the next poll recursively
poll();
}, dataType: "json"});
}, 30000);
})();
Run Code Online (Sandbox Code Playgroud)
这是长轮询的例子:
(function poll(){
$.ajax({ url: "server", success: function(data){
//Update your dashboard gauge
salesGauge.setValue(data.value);
}, dataType: "json", complete: poll, timeout: 30000 });
})();
Run Code Online (Sandbox Code Playgroud)
谢谢!
对于交互式Web应用程序,Websockets等内容越来越受欢迎.但是,由于客户端和代理世界并不总是完全兼容,因此通常使用像"Socket.IO"这样的复杂框架,为任何可能禁用其他情况的情况隐藏几种不同的机制.
我只是想知道正确实现的长轮询的缺点是什么,因为今天的服务器就像node.js一样,它很容易实现,并且依赖于支持良好的旧http技术(尽管长轮询行为本身可能会破坏它).
从高级别来看,长轮询(尽管有一些额外的开销,对于中等流量应用程序可行)类似于WebSockets所做的真正的推送行为,因为服务器实际上在他喜欢的时候发送它的答案(尽管有一些超时/心跳机制).
因此,我认为由于TCP/IP确认更多,我们会有更多的开销,但是没有像频繁轮询那样的持续流量.
使用事件驱动的服务器,我们没有线程开销来阻止连接.
那么还有其他任何困难的下行方式会迫使像聊天这样的中等流量应用使用WebSockets而不是长时间的轮询吗?
我正在构建一个需要相对不变的数据库轮询的网页组件.我可以看到两种不同的方法,我想知道其中一种是否比其他方法更好,或者我是否缺少第三种选择.
1)每隔1或2秒发送一次AJAX请求以检查更新.无论是否有新数据,每个请求都会立即返回.
2)触发单个AJAX请求,该请求在收到数据或发生超时之前不会返回.在其中任何一个发生时,它会触发下一个请求.(我认为这叫做长轮询?)
数据库查询的数量与之相同,但使用#2,从浏览器发出的请求将减少,这可以节省带宽和客户端资源.对于服务器,最好让一个PHP请求保持活动状态并在查询之间休眠,或者每隔几秒触发一次,轮询数据库,然后关闭?或者没有区别,我对此太过强调了?
编辑:我想我还应该声明这是一个更大的网络应用程序的聊天小部件.通信的轻微延迟不会杀死用户,因为聊天是次要功能.
嗨我明白,在长轮询中你保持与服务器的连接打开很长时间,直到你从服务器得到一个响应,然后再次轮询并等待下一个响应.但是,我似乎不明白如何编码它.下面有这个代码使用长轮询,但我似乎没有得到它
(function poll(){
$.ajax({ url: "server", success: function(data){
//update page based on data
}, dataType: "json", complete: poll, timeout: 30000 });
})();
Run Code Online (Sandbox Code Playgroud)
但是这里的连接如何保持开放.我知道一旦获得服务器的响应,就会再次触发"poll"功能.但是如何保持连接打开?
编辑1: - 如果有人也可以解释这里实际超时的情况,那将会很棒
我的页面上有一个很长的轮询请求.服务器端的脚本在20秒后设置为超时.
因此,当长轮询"空闲"并且用户按下另一个按钮时,该新请求的发送被延迟,直到前一个脚本超时.
我看不出jQuery方面的代码有什么问题.为什么onclick事件会延迟?
function poll()
{
$.ajax({
url: "/xhr/poll/1",
data: {
user_id: app.user.id
},
type: "POST",
dataType: "JSON",
success: pollComplete,
error: function(response) {
console.log(response);
}
});
}
function pollComplete()
{
poll();
}
function joinRoom(user_id)
{
$.ajax({
url: "/xhr/room/join",
dataType: "JSON",
type: "POST",
data: {
user_id: app.user.id,
room_id: room.id
}
});
}
<button id="join" onclick="javascript:joinRoom(2);">Join</button>
############ PHP Controller on /xhr/poll
$time = time();
while ((time() - $time) < 20)
{
$updates = $db->getNewStuff();
foreach ($updates->getResult() as $update)
$response[] = $update->getResponse();
if …Run Code Online (Sandbox Code Playgroud) 我正在分布式环境中在Play 2.0中实现长轮询.我理解的方式是,当Play获取请求时,它应该暂停更新的待处理通知,然后转到数据库以获取新数据并重复.我开始查看Play 2.0提供的聊天示例,但它是在websocket中.此外,它看起来不像是能够分发.所以我想我会用Akka的赛车.我采用了事件流实现并使用LookupClassification复制了我自己的实现.但是我很难知道我将如何收到消息(或者就此而言,应该是订户而不是ActorRef)?
EventStream实现:https: //github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/event/EventStream.scala
我正在尝试创建一个像Facebook一样的发布系统.所以我做了一些关于Facebook如何做的研究,Facebook使用长轮询,所以我搜索了如何实现它,我实现它.我终于完成了它,我打开了Firefox和Chrome来测试它.在2或3个帖子之后它起作用,但之后它将复制结果.如下所示:

顺便说一句,这是第一篇文章.
这是我的网络选项卡,在此过程中:

它发出3个请求而不是1个.
最后这是我的代码:
init.js包含我的所有JavaScript代码
function getNewPosts(timestamp) {
var t;
$.ajax({
url: 'stream.php',
data: 'timestamp=' + timestamp,
dataType: 'JSON',
})
.done(function(data) {
clearInterval( t );
// If there was results or no results
// In both cases we start another AJAX request for long polling after 1 second
if (data.message_content == 'results' || data.message_content == 'no-results') {
t = setTimeout( function() {
getNewPosts(data.timestamp);
}, 1000);
// If there was results we will append it to the post div …Run Code Online (Sandbox Code Playgroud) 我的网络应用程序使用"长轮询"方法来跟踪我服务器的最新数据.服务器只有在有新数据时才会响应,这可能相隔很多分钟.(这是一个加热控制系统,您只能在室温变化或有人更改设置时看到更新).
var version = "0";
function updater() {
$.ajax({
type: "POST",
url: "/listen",
data: version,
success: function (data) {
version = handleUpdates(data);
updater();
},
error: function () {
setTimeout(updater, 1000);
}
});
}
Run Code Online (Sandbox Code Playgroud)
除了一种情况外,它在桌面浏览器和手机上运行良好.我发现在带有Chrome的Android手机上,在手机进入睡眠状态超过10分钟后会发生奇怪的事情.邮件请求似乎被删除,我认为这是合理的,因为手机是睡着了.在Chrome调试器的"网络"选项卡中,POST请求的状态文本显示(已取消).
问题是当我取消请求时唤醒手机,调用success()或error()函数,我的Web应用程序永远不会更新.$ .ajax()已经违背了给我回电话的承诺.
问题只发生在某些设备上.我已经能够通过借用朋友的设备进行一些临时测试.到目前为止,我只看到Android手机上的问题.但不是手机连接到充电器.我没有在任何平板电脑,苹果设备或Windows PC上看到它.
我尝试在ajax设置中添加超时:
timeout: 120 * 1000,
Run Code Online (Sandbox Code Playgroud)
这有帮助,因为error()函数最终在唤醒后最多调用2分钟.但我希望用户在1或2秒内看到更新.我不想让超时这么短,因为它会产生不必要的服务器流量.
我还尝试通过查找一秒钟setInterval中的迟到来检测设备是否处于睡眠状态,如任何桌面浏览器都可以检测到计算机何时从睡眠状态恢复?.当我检测到唤醒时,我中止()帖子并启动另一个.这在大多数情况下都有帮助 但事实证明这是不可靠的.有时时间事件似乎在睡眠期间保持正常滴答,并且无论如何都会取消后期请求.它并不像一个可靠的解决方案.
我使用的是最新版本的jQuery:(2.1.2)和Chrome(47).
long-polling ×10
javascript ×5
ajax ×4
jquery ×3
websocket ×3
php ×2
polling ×2
akka ×1
backbone.js ×1
battery ×1
comet ×1
ios ×1
networking ×1
node.js ×1
performance ×1
pubnub ×1
scala ×1
socket.io ×1