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

a。行うすべてのリクエストのキューを維持できます。

$.xhrQueue = [];

b。行った各リクエストをキューに入れます

$.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 に答える