我一直在试图在过去两天得到这个工作没有运气。它执行一次,但在初始加载后无法继续更新。该功能不会自动更新,也不会在30秒后重新启动。代码对我来说看起来很好,但显然我有一些关于长轮询的知识缺口,这导致了这种情况不起作用。如果有人有片刻,我会很感激,如果你能梳理这一点,告诉我什么是我做错了。任何帮助表示赞赏,谢谢。AJAX长轮询不会保持连接打开
的JavaScript/jQuery的
function poll(pid){
var dataString = 'pid=' + pid;
$.ajax({type: 'GET', url: 'http://localhost:8888/mysite/execs/vote_count.php', data: dataString, async: true, cache: false, success: function(data){
var post = $('#' +pid);
var post_children = post.children();
var upvotes = post_children.find('.upvotes');
var downvotes = post_children.find('.downvotes');
downvotes.text("-" + data.downvotes);
upvotes.text("+" + data.upvotes);
}, dataType: "json", complete: poll, timeout: 30000 });
};
$(".post").each(function(){
poll($(this).attr("id"));
});
PHP(vote_count.php)
<?php
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$database = 'database';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM vote WHERE post = :pid AND rating = 'votedown'");
$pid = $_GET['pid'];
$stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
$stmt->execute();
$downvotes = $stmt->rowCount();
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM vote WHERE post = :pid AND rating = 'voteup'");
$pid = $_GET['pid'];
$stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
$stmt->execute();
$upvotes = $stmt->rowCount();
$arr = array("downvotes"=>$downvotes,"upvotes"=>$upvotes);
echo json_encode($arr);
$dbh = null;
?>
你说得对,那是我的主要问题。我很惊讶,我没有想到这一点。然而,尽管这个问题,我的理解是,这种连接应该保持开放并创建(看似)自动更新。否则,我可以使用setInterval。但即使在最初的30秒内,也没有任何变化。 – Ian 2012-04-18 21:32:00
我的PHP有一个星期,但我没有看到在您的JavaScript保持连接打开。当AJAX调用本身超时时,所有超时都会覆盖,jQuery每次只为每个帖子调用一次轮询函数。 – devstruck 2012-04-18 21:37:51
这里是一个更好和干净的模式,以长池http://blog.falafel.com/Blogs/basem-emara/2012/06/06/polling-ajax-requests-in-javascript – ozhan 2013-03-26 17:52:46