防止堆叠AJAX请求

时间:2011-04-01 11:51:18

标签: php javascript jquery

我遇到了一个似乎无法解决的问题。

我目前正在实现一个类似于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作为查询 - 这导致双帖。

任何人都知道如何防止这种情况?

2 个答案:

答案 0 :(得分: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--;}                   
            });
        }
        }
    });

答案 1 :(得分:1)

在发出请求之前,我会将布尔值设置为true,每当请求完成时,我都会将其设置为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 ) );