首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP jQuery长轮询聊天应用程序

PHP jQuery长轮询聊天应用程序
EN

Stack Overflow用户
提问于 2012-11-18 06:48:51
回答 2查看 3.7K关注 0票数 2

我已经做了一个简单的带有短轮询(AJAX刷新)的jQuery聊天应用程序。比如,每隔2-3秒它就会请求新的消息。但是,我读到长轮询是聊天应用程序的一种更好的方法。所以,我看了一些很长的投票脚本。我是这样做的:

Javascript:

代码语言: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

代码语言:javascript
复制
<?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())永远不会执行。那么有什么变通的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-18 06:55:48

我强烈建议您阅读两件事:长轮询背后的想法和jQuery回调。我将快速介绍这两种方法,但仅限于此框所允许的详细内容。

长轮询

长轮询背后的想法是让when服务器在返回请求时人为地“减速”,以便它等待,直到事件出现,然后立即提供信息,并关闭连接。这意味着您的服务器将处于空闲状态一段时间(嗯,不是空闲,但您知道我的意思),直到它最终获得消息通过的信息,将其发送回客户端,并继续下一条消息。

在JS客户端,其效果是Ajax 回调(这是重要的部分)被延迟。

jQuery .ajax()

$.ajax()会立即返回。这真是不太好。您有两个选择来解决这个问题:

  • 在成功和错误回调函数中绑定您的递归调用(这很重要。错误函数很可能由于超时而出现)
  • (如下所示):

使用以下命令:

代码语言:javascript
复制
var x = $.ajax({blah});
$.when(x).done(function(a) { recursiveCallHere(); });

两者最终都是一回事。您将在回调而不是初始化时触发递归。

附言:sleep(1)出了什么问题

票数 5
EN

Stack Overflow用户

发布于 2012-11-18 06:53:59

在长轮询中,当您收到前一个请求的数据时,应该发起新的请求。否则,你将在浏览器冻结中进行无限递归。

代码语言:javascript
复制
var getNewMessage = function() {
    $.ajax({
        url: 'chat-handler.php',
        dataType: 'json',
        data: {action : 'read', message : 'message'},
        success: function(data) {
            alert(data);

            getNewMessage();   // <-- should be here
        }
    });
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13435565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档