2012-04-18 93 views
0

我一直在試圖在過去兩天得到這個工作沒有運氣。它執行一次,但在初始加載後無法繼續更新。該功能不會自動更新,也不會在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; 
?> 

回答

0

主要的問題,我覺得你有在你的假設完整:調查將使用傳入來自當前調用的參數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秒。 (我的額外兩分錢)

編輯:增加了超時提到。第一次把它排除在外。

+0

你說得對,那是我的主要問題。我很驚訝,我沒有想到這一點。然而,儘管這個問題,我的理解是,這種連接應該保持開放並創建(看似)自動更新。否則,我可以使用setInterval。但即使在最初的30秒內,也沒有任何變化。 – Ian 2012-04-18 21:32:00

+0

我的PHP有一個星期,但我沒有看到在您的JavaScript保持連接打開。當AJAX調用本身超時時,所有超時都會覆蓋,jQuery每次只爲每個帖子調用一次輪詢函數。 – devstruck 2012-04-18 21:37:51

+0

這裏是一個更好和乾淨的模式,以長池http://blog.falafel.com/Blogs/basem-emara/2012/06/06/polling-ajax-requests-in-javascript – ozhan 2013-03-26 17:52:46

0

我認爲一旦你收到一個響應..瀏覽器不會也不應該保持連接打開..也很大程度上取決於瀏覽器使用你的瀏覽器和標題你發送..很多PHP的人,但是Header shud包含連接:保持連接以保持連接。
。 也將通過我進行的各種測試。
1. IE不會保持現有連接打開,但會同時打開2個連接,並保持第二個連接打開並關閉第一個連接。
2.Chrome行爲很好地發送2個請求(一個爲favicon),但保持連接打開。
3. Mozilla只發送一個請求並保持打開狀態。
你用IE9來測試這個嗎?

+0

我在Chrome上,也在沒有雙啓動Windows的Mac上,所以即使我想要,我也無法在IE9中測試它,除非我將這些文件轉移到我朋友的comp中。 – Ian 2012-04-18 21:51:47

+0

我的壞.. :(你可以檢查你從服務器回來的響應頭。 – 2012-04-18 21:56:00