4

如果第一个请求超时,有人可以向我展示一个关于为我的 $.ajax 请求设置超时并重做整个请求的实际示例,我已经阅读了文档但没有得到它。我将不胜感激。

这是我的 $.ajax 请求。

    $.ajax({
        url: '<?php bloginfo('template_directory'); ?>/ajax/product.php',
        type: 'get',
        data: {product_id : product_id},
        beforeSend: function(){
            $('#details').html('<div class="loading"></div>');
        },
        success: function(data){
            $('.iosSlider').fadeOut('fast');
            thisprod.addClass('current');
            $('#details').css({opacity: 0}).html(data).stop().animate({left: 0, opacity: 1}, 800);
        }
    });
    return false;
4

4 回答 4

7

ajax函数带有一个超时参数,您可以检查状态以防出错。

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();
            }
        }
    });
};

您可能想要做一些更聪明的事情来避免永久调用......

从文档中:

为请求设置超时(以毫秒为单位)。这将覆盖使用 $.ajaxSetup() 设置的任何全局超时。超时时间从 $.ajax 调用开始;如果有几个其他请求正在进行并且浏览器没有可用的连接,则请求可能会在发送之前超时。在 jQuery 1.4.x 及以下版本中,如果请求超时,XMLHttpRequest 对象将处于无效状态;访问任何对象成员都可能引发异常。仅在 Firefox 3.0+ 中,脚本和 JSONP 请求不能被超时取消;即使脚本在超时期限之后到达,它也会运行。

于 2012-09-04T15:00:44.417 回答
0

一种。您可以维护您发出的所有请求的队列。

$.xhrQueue = [];

湾。将您提出的每个请求排入队列

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

C。轮询哪些请求已完成与超时

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);

注意:如果没有beforeSend,您可以通过其他一些功能尝试进行 ajax 调用

于 2012-09-04T15:07:57.263 回答
0

对于这种情况,我会使用 jquery 延迟失败回调。 http://api.jquery.com/deferred.fail/

于 2012-09-04T15:13:41.280 回答
-1

试试这个

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);
于 2012-09-04T15:07:57.373 回答