How to set timeout on $.ajax request and redo it if it takes too long?

前端 未结 4 1077
有刺的猬
有刺的猬 2021-01-20 16:26

Can someone show me a practical example on setting a timeout to my $.ajax request and redo the entire request if the first request is timed out, I\'ve read the docs and didn

相关标签:
4条回答
  • 2021-01-20 16:45

    a. You can maintain a queue of all the requests that you make.

    $.xhrQueue = [];
    

    b. Enqueue each request that you make

    $.ajaxSetup({
        beforeSend: function (e, xhr) {  
                $.xhrQueue .push(xhr);
            }
    });
    

    c. Poll for which requests completed vs timed-out

    setInterval(function(){
        $.each($.xhrQueue, function (xhr) {
           //check whether status is complete, 
           //with some try-catch you can know which were the timed-out/not-sent ones
    
        });
    }, 1000);
    

    Note: If not beforeSend, you can go via some other function through which you attempt to make an ajax call

    0 讨论(0)
  • 2021-01-20 16:47

    Try this

    var setTime = setTimeOut(function() {
        $.ajax({
            url: '<?php bloginfo('
            template_directory ');?>/ajax/product.php',
            type: 'GET',
            data: {
                'product_id': product_id
            }
        }).beforeSend(function() {
            $('#details').html('<div class="loading"></div>');
        }).done(function(data) {
            $('.iosSlider').fadeOut('fast');
            thisprod.addClass('current');
            $('#details').css({
                opacity: 0
            }).html(data).stop().animate({
                left: 0,
                opacity: 1
            }, 800);
        });
    }, 2000);
    
    0 讨论(0)
  • 2021-01-20 16:49

    I would use the jquery deferred fail callback for this case. http://api.jquery.com/deferred.fail/

    0 讨论(0)
  • 2021-01-20 17:00

    The ajax function takes a timeout parameter and you can check the status in case of error.

    var call =function(){
        $.ajax({
            url: '<?php bloginfo('template_directory'); ?>/ajax/product.php',
            type: 'get',
            timeout: 400,
            ...
            error: function(x, textStatus, m) {
                if (textStatus=="timeout") {
                     call();
                }
            }
        });
    };
    

    You might want to make something a little smarter to avoid permanent calls...

    From the documentation :

    Set a timeout (in milliseconds) for the request. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent. In jQuery 1.4.x and below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period.

    0 讨论(0)
提交回复
热议问题