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

+0

Мой PHP - небольшая неделя, но я не вижу в вашем javascript никаких ссылок, чтобы открыть соединение. Весь тайм-аут отменяется, когда вызов AJAX сам разыгрывается, а jQuery каждый раз вызывает функцию опроса один раз для каждого сообщения. – devstruck

+0

вот лучший и чистый шаблон для длительного объединения http://blog.falafel.com/Blogs/basem-emara/2012/06/06/polling-ajax-requests-in-javascript – ozhan

0

Я думаю, что когда-нибудь вы получите ответ .. браузер не будет и не должен поддерживать соединение открытым. Также это зависит от браузера ur и заголовков ур отправки .. im nt большая часть PHP-парня, но .. Заголовки заголовка содержат Connection: Keep-alive, чтобы поддерживать соединение открытым.
. также проходил различные тесты, которые я проводил.
1. IE не будет поддерживать существующее соединение открытым, но одновременно откроет 2 соединения и сохранит второй и закроет первый.
2.Chrome ведет себя красиво отправить 2 запроса (один для favicon), но сохраняет соединение открытым.
3. Mozilla отправляет только один запрос и держит его открытым.
Вы используете IE9 для проверки этого?

+0

Я нахожусь в Chrome, также на Mac, который не является двойной загрузкой Windows, поэтому я не могу протестировать его в IE9, даже если бы захотел, если только я не передам файлы на comp моего друга. – Ian

+0

мой плохой .. :(можно проверить заголовки ответов ур, возвращающиеся с сервера. –