Tej*_*hav 2 javascript php ajax jquery long-polling
我用短轮询(AJAX Refresh)创建了一个简单的PHP jQuery Chat应用程序.比如,每2到3秒就要求新消息.但是,我读到Long Polling是一种更好的聊天应用程序方法.所以,我经历了一些Long Polling脚本.我是这样做的:
$("#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);
Run Code Online (Sandbox Code Playgroud)
<?php
$time = time();
while ((time() - $time) < 25) {
$data = $db->getNewMessage ();
if (!empty ($data)) {
echo json_encode ($data);
break;
}
usleep(1000000); // 1 Second
}
?>
Run Code Online (Sandbox Code Playgroud)
问题是,一旦getNewMessage()启动,它将执行,除非它得到一些响应(来自chat-handler.php).它以递归方式执行.但是如果有人想在其间发送消息,那么实际上该函数($("#submit").click())永远不会执行,因为getNewMessage()仍在执行.那么有什么解决方法吗?
我强烈建议你阅读两件事:长轮询和jQuery回调背后的想法.我会很快进入两者,但只有这个盒子允许我这么详细.
长期民意调查
长轮询背后的想法是让网络服务器在返回请求时人为地"减速",以便等待事件发生,然后立即提供信息,并关闭连接.这意味着你的服务器将闲置一段时间(好吧,不是空闲,但你知道我的意思),直到它最终获得消息通过的信息,将其发送回客户端,然后继续进行下一个一.
在JS客户端,效果是Ajax 回调(这是重要的一点)被延迟了.
jQuery .ajax()
$.ajax()马上回来.这个不好.您有两种方法可以解决此问题:
用这个:
var x = $.ajax({blah});
$.when(x).done(function(a) { recursiveCallHere(); });
Run Code Online (Sandbox Code Playgroud)
两者最终都是相同的.你在回调时触发你的递归,而不是在启动时.
PS:怎么了sleep(1)?
| 归档时间: |
|
| 查看次数: |
3587 次 |
| 最近记录: |