2012-04-18 105 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