如何修复Jquery轮询继续无限?

时间:2016-05-17 08:25:47

标签: javascript php jquery ajax-polling

我希望每隔3分钟刷新一次页面。它包含一个表,其中每一行代表一个帖子的细节。

用户可以回复该帖子,该通知将显示为带有1的红色气泡(未读消息号)。

我正在尝试使用简单的Jquery 轮询技术来实现这一目标。但是,我做错了什么,并没有像我期望的那样工作。

我有一个像这样的HTML:

<?php
for($posts as $row)
{
if($entity == 'post')
{ $id = $row['id'];?>
    <a href="javascript:void(0)" onclick="push_notification('<?php echo $entity;?>','<?php echo $id;?>')" title="Push Notification">
        <img src="<?php echo(base_url())?>assets/images/icon/arrow_right.png" width="22" height="22" border="0" alt="Push Notification" onload="chat_review('<?php echo $id;?>')"/></a>
    <a href="<?php echo base_url();?>admin/<?php echo $entity;?>/<?php echo $entity;?>_chat/<?php echo $id;?>" title="Chat">
        <div class="ch_comment" id="chatReviewDiv_<?php echo $id;?>"><?php if($row['chat_count']>0){?><div class="notify"><?php echo $row['chat_count'];?></div><?php }?></div>
    </a>
<?php
} }?>

现在这里是onload函数:

function chat_review(post_id)
{
    $.post('<?php echo base_url();?>ajax-function', 
        {'data':'chat',
        'id': post_id,
        'action': 'select'},
        function(data) {
            alert(data.id);
            if(data.chatCount > 0)
            {
                $("#chatReviewDiv_"+data.id).clear();
                $("#chatReviewDiv_"+data.id).append("<div class='notify'>"+data.chatCount+"</div>");
            }  // process results here
            setTimeout(chat_review(data.id),50000);
    }, 'json');
}

然而,这导致了数量限制的溢出。 Firebug Limit Reached

导致这种突然行为的原因是什么? 我怎么解决这个问题?该列表应该调用chat_review函数20次(20个帖子)。然后在3分钟后,将再次为每个20个帖子调用chat_review。但是目前,chat_review被无限调用。

1 个答案:

答案 0 :(得分:0)

您以错误的方式使用setTimeout。你立即打电话给chat_review,它无限地召唤自己。您应该传递函数的引用,或者使用额外的function包装器:

function chat_review(post_id)
{
    $.post('<?php echo base_url();?>ajax-function', 
        {'data':'chat',
        'id': post_id,
        'action': 'select'},
        function(data) {
            alert(data.id);
            if(data.chatCount > 0)
            {
                $("#chatReviewDiv_"+data.id).clear();
                $("#chatReviewDiv_"+data.id).append("<div class='notify'>"+data.chatCount+"</div>");
            }  // process results here
            setTimeout(function(){
                chat_review(data.id)
            },50000);
    }, 'json');
}

使用.bind

function chat_review(post_id)
{
    $.post('<?php echo base_url();?>ajax-function', 
        {'data':'chat',
        'id': post_id,
        'action': 'select'},
        function(data) {
            alert(data.id);
            if(data.chatCount > 0)
            {
                $("#chatReviewDiv_"+data.id).clear();
                $("#chatReviewDiv_"+data.id).append("<div class='notify'>"+data.chatCount+"</div>");
            }  // process results here
            setTimeout(chat_review.bind('', data.id),50000);
    }, 'json');
}