私は最後の2日間、これを運がうまく動作するようにしようとしています。 1回実行されますが、最初のロード後に更新を続行できません。この機能は自動的に更新されず、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
私のPHPはちょっとした週ですが、接続を開いたままにするためにjavascriptに何も表示されません。すべてのタイムアウトは、AJAX呼び出しがそれ自体で時間切れになるとオーバーライドされ、jQueryはポスト関数ごとに1回だけポーリング関数を呼び出します。 – devstruck
ここに長いプーリングのためのより良い、きれいなパターンhttp://blog.falafel.com/Blogs/basem-emara/2012/06/06/polling-ajax-requests-in-javascript – ozhan