0

私は過去2日間、これをうまく機能させようとしてきました。1 回実行されますが、初期ロード後に更新を続行できません。この機能は自動的に更新されず、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

私があなたが抱えていると思う主な問題は、完全であると仮定することです。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秒ごとにページごとに1回ではなく、30秒ごとにページごとに1回呼び出す(そして投稿の更新の配列を返す)ことを検討してください。 。(私の余分な2セント。)

編集:言及されたタイムアウトを追加しました。初めてそれを省きました。

于 2012-04-18T21:27:46.553 に答える
0

私は一度あなたが応答を受け取ると思います..ブラウザは接続を開いたままにしないでしょう. shud には Connection:Keep-alive が含まれており、接続を開いたままにします。
. また、私が実施したさまざまなテストも行っています。
1. IE は既存の接続を開いたままにしませんが、2 つの接続を同時に開き、2 つ目の接続を開いたままにし、最初の接続を閉じます。
2.Chrome は正常に動作し、2 つのリクエスト (ファビコン用のリクエスト) を送信しますが、接続を開いたままにします。
3. Mozilla はリクエストを 1 つだけ送信し、それを開いたままにします。
これをテストするためにIE9を使用していますか?

于 2012-04-18T21:39:35.563 に答える