0

在过去的两天里,我一直在努力让这个工作没有运气。它执行一次,但在初始加载后无法继续更新。该功能不会自动更新,也不会在 30 秒后重新启动。该代码对我来说似乎很好,但显然我对长轮询存在一些知识差距,这导致它不起作用。如果有人有时间,如果您能梳理一下并告诉我我做错了什么,我将不胜感激。任何帮助表示赞赏,谢谢。

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;
?>
4

2 回答 2

0

我认为您遇到的主要问题是您假设 complete: poll 将使用当前调用中传入的参数 pid 。试试这个。

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: function(xhr, status){
            setTimeout(function(){poll(pid);}, 30000);
        }, 
        timeout: 30000 
    });
}

$(".post").each(function(){
    poll($(this).attr("id"));
});

综上所述,如果您有很多帖子要检查更新,您可能会考虑将这些调用捆绑起来,并每 30 秒每页调用一次(并返回一组帖子更新),而不是每 30 秒每页每帖子调用一次. (我额外的两分钱。)

编辑:添加了提到的超时。第一次把它丢了。

于 2012-04-18T21:27:46.553 回答
0

我想一旦你收到回复..浏览器不会也不应该保持连接打开..这也很大程度上取决于你使用的浏览器和你发送的标题..我不是一个 PHP 人但是..标题shud 包含 Connection:Keep-alive 以保持连接打开。
. 还要通过我进行的各种测试。
1. IE 不会保持现有连接打开,而是会同时打开 2 个连接,并保持第二个打开并关闭第一个。
2.Chrome 可以很好地发送 2 个请求(一个用于 favicon),但保持连接打开。
3. Mozilla 只发送一个请求并保持打开状态。
你是用IE9来测试的吗?

于 2012-04-18T21:39:35.563 回答