2011-04-01 170 views
4

我遇到了一个我似乎无法解决的问题。防止堆叠AJAX请求

我目前正在实现一个类似于Twitter使用的AJAX函数 - 可以在滚动上获取新帖子。

jQuery的看起来是这样的:

 $(window).scroll(function(){ 
      if($(window).scrollTop() == $(document).height() - $(window).height()){ 
       $('div#ajaxloader').show(); 
       $.ajax({ 
        url: "loader.php?lastid=" + $(".container:last").attr("id"), 
        success: function(html){ 
         if(html){ 
          $("#main").append(html); 
          $('div#ajaxloader').hide(); 
         }else{ 
          $('div#ajaxloader').html('No more posts to show.'); 
         } 
        }     
       }); 
      } 
     }); 

现在的问题;如果用户的滚动速度非常快,并且数据库正在快速运行,那么jQuery似乎不能够以足够快的速度发送正确的ID作为查询,这会导致双重帖子。

任何人都有一个好主意,如何防止这种情况?

回答

5

试试这个:

var runningRequest = 0; 
    $(window).scroll(function(){ 
     if(runningRequest <1){ 
     if($(window).scrollTop() == $(document).height() - $(window).height()){ 
      runningRequest++; 
      $('div#ajaxloader').show(); 
      $.ajax({ 
       url: "loader.php?lastid=" + $(".container:last").attr("id"), 
       success: function(html){ 
        runningRequest--; 
        if(html){ 
         $("#main").append(html); 
         $('div#ajaxloader').hide(); 
        }else{ 
         $('div#ajaxloader').html('No more posts to show.'); 
        } 
       } 
       error: function(){runningRequest--;}     
      }); 
     } 
     } 
    }); 
+0

你也可以把runningRequest--;进入ajax请求的完整部分:而不是成功和错误部分。 – ITroubs 2011-04-01 12:05:19

+0

这个伎俩!非常聪明 - 而且很简单=)谢谢你一堆! – Marcus 2011-04-01 12:08:00

+0

我正在写这个确切的信号量回答¬¬ – Coquevas 2011-04-01 12:09:56

1

我会设置一个布尔值,真正的权利让我的请求之前,每当请求完成我将它设置为false。然后,我将包装进行请求的代码检查该值是true还是false。我还会添加一个bool,告诉我我是否应该打扰请求 - 在请求最后一个请求是否回到空的时候没有意义(除非数据集自上次请求以来可能会发生变化)。无论哪种方式,这里是我开始的代码:

(function(global) 
{ 
    var $ = global.jQuery, 
     $win = $(global), 
     $doc = $(global.document), 
     $ajaxLoader = $('div#ajaxloader'), 
     $main = $('#main'), 
     requestInProgress = false, 
     outOfPosts = false; 

    $win.scroll(function() 
    { 
     if(! requestInProgress && 
      ! outOfPosts && 
      $win.scrollTop() === $doc.height() - $win.height() 
     ) 
     { 
      requestInProgress = true; 

      $ajaxLoader.show(); 

      $.ajax({ 
       url: 'loader.php', 
       data: { 
        lastid: $('.container:last').attr('id') 
       }, 
       success: function(html) 
       { 
        if(html) 
        { 
         $main.append(html); 
         $ajaxLoader.hide(); 
        } 
        else 
        { 
         outOfPosts = true; 
         $ajaxLoader.html('No more posts to show.'); 
        } 
       }, 
       complete: function() 
       { 
        requestInProgress = false; 
       } 
      }); 
     } 
    }); 
}(window)); 
+0

非常感谢你,与@ITroubs的回答非常相似 - 尽管已经接受了他的回答。 – Marcus 2011-04-01 12:11:00

+0

没有问题。不过,请阅读我的回复和代码。如果请求返回时没有任何数据(如果它符合你正在做的事情的心态),我建议检查停止轮询数据。我也让你的代码更具性能,因为我修复了所有额外的API调用,这些调用重新调用了DOM已有的东西。 – JAAulde 2011-04-01 12:15:00