需要解释彗星计划

时间:2011-01-08 10:18:28

标签: php ajax comet

我是Comet编程的新手。我搜索并编写了这样的代码

<script type="text/javascript" charset="utf-8">           

        function waitForMsg(){                
            $.ajax({
                type: "GET",
                url: "getMessage.php",
                async: true, 
                cache: false,
                timeout:50000, 
                success: function(data){                        
                    $('#messages).append(data);
                    setTimeout(
                    'waitForMsg()',
                    1000
                );
                },
                error: function(XMLHttpRequest, textStatus, errorThrown){
                    addmsg("error", textStatus + " (" + errorThrown + ")");
                    setTimeout(
                    'waitForMsg()', 
                    "15000");
                },
            });
        };

        $(document).ready(function(){                
            waitForMsg();               

        });
    </script>

当我将消息传递给getMessage.php时,我从getMessage.php获取更新

但我怀疑是否使用了

setTimeout('waitForMsg()',1000);

这意味着什么。如果我们每1秒调用 waitForMsg()那么 Ajax Comet 编程之间有什么区别。

2 个答案:

答案 0 :(得分:1)

关于您的示例,Ajax和Comet之间的区别取决于getMessage.php如何响应来自客户端的请求。

使用 Ajax ,即使没有要返回的新消息,getMessage.php也会立即返回。然后,客户端将等待指定的间隔,然后发送另一个请求,再次接收新消息或根本不发送任何消息。最终结果是客户端将使用新消息更新的最快速度是指定的时间间隔。

另一方面,使用 Comet ,getMessage.php在返回之前不会返回。对客户端的初始请求有意义,它将检查新消息,如果没有可用,它将睡眠一段时间并再次检查。此过程将持续到新消息可用或发生超时,此时客户端将向服务器发送另一个请求并重新开始该过程。在这种情况下,最终结果是客户端似乎立即更新。

答案 1 :(得分:0)

有多种COMET。您正在使用AJAX polling,但还有其他技术,例如forever-frame,不涉及轮询。

Forever-frame使用隐藏的无限长iframe,服务器会根据需要推送script个标记。

另请注意,AJAX轮询的某些用法(例如维基百科所解释的)不包含setTimeout,因为它们会立即在成功处理程序中启动新的AJAX请求。

另外(使用AJAX轮询示例),您可以使用:

setTimeout(waitForMsg, 1000);

不需要字符串。