我已经做了一个简单的带有短轮询(AJAX刷新)的jQuery聊天应用程序。比如,每隔2-3秒它就会请求新的消息。但是,我读到长轮询是聊天应用程序的一种更好的方法。所以,我看了一些很长的投票脚本。我是这样做的:
Javascript:
$("#submit").click(function(){
$.ajax({
url: 'chat-handler.php',
dataType: 'json',
data: {action : 'read', message : 'message'}
});
});
var getNewMessage = function() {
$.ajax({
url: 'chat-handler.php',
dataType: 'json',
data: {action : 'read', message : 'message'},
function(data){
alert(data);
}
});
getNewMessage();
}
$(document).ready(getNewMessage);PHP
<?php
$time = time();
while ((time() - $time) < 25) {
$data = $db->getNewMessage ();
if (!empty ($data)) {
echo json_encode ($data);
break;
}
usleep(1000000); // 1 Second
}
?>问题是,一旦getNewMessage()启动,它就会执行,除非它得到一些响应(来自chat-handler.php)。它以递归方式执行。但是,如果有人想在两者之间发送一条消息,那么实际上,由于getNewMessage()仍在执行,所以函数($("#submit").click())永远不会执行。那么有什么变通的方法吗?
发布于 2012-11-18 06:55:48
我强烈建议您阅读两件事:长轮询背后的想法和jQuery回调。我将快速介绍这两种方法,但仅限于此框所允许的详细内容。
长轮询
长轮询背后的想法是让when服务器在返回请求时人为地“减速”,以便它等待,直到事件出现,然后立即提供信息,并关闭连接。这意味着您的服务器将处于空闲状态一段时间(嗯,不是空闲,但您知道我的意思),直到它最终获得消息通过的信息,将其发送回客户端,并继续下一条消息。
在JS客户端,其效果是Ajax 回调(这是重要的部分)被延迟。
jQuery .ajax()
$.ajax()会立即返回。这真是不太好。您有两个选择来解决这个问题:
使用以下命令:
var x = $.ajax({blah});
$.when(x).done(function(a) { recursiveCallHere(); });两者最终都是一回事。您将在回调而不是初始化时触发递归。
附言:sleep(1)出了什么问题
发布于 2012-11-18 06:53:59
在长轮询中,当您收到前一个请求的数据时,应该发起新的请求。否则,你将在浏览器冻结中进行无限递归。
var getNewMessage = function() {
$.ajax({
url: 'chat-handler.php',
dataType: 'json',
data: {action : 'read', message : 'message'},
success: function(data) {
alert(data);
getNewMessage(); // <-- should be here
}
});
}https://stackoverflow.com/questions/13435565
复制相似问题