2013-05-02 1 views
0

Когда я использую обратный вызов успеха, это решение работает нормально, но когда я использую .done(), это не удается, как я могу повторить отправку запроса на ajax с заданным значением .done() .fail() и завершенные() зарегистрированные обратные вызовы?Задержка JQuery Ajax (jqXHR) Запрос с завершенными/неудачными/полными обратными вызовами

var requestQueue = []; 
     $.ajaxSetup({ 
      cache: false, 
      beforeSend: function (jqXHR, options) {         
       if(true){ //any condition 'true' just demonstrate 
        requestQueue.push({request:jqXHR,options:options}); 
        //simulate process this queue later for resend the request 
        window.setTimeout(function(){ 
         //this will work with success callbak option, 
         //but with .done() the console.log("Well Done!"); 
         // will fail        
         $.ajax($.extend(requestQueue.pop().options, {global:false, beforeSend:null})); 
        }, 3000) 
        return false; 
       } 
      }   
     }); 
     $.ajax({ 
      url:"TesteChanged.html", 
      error: function(){ 
       console.log("Oh nooooo!"); 
      } 
     }).done(function(){ 
      console.log("Well Done!"); 
     }); 

Я хочу Ставить в Ajax вызова (основанный в состоянии), чтобы отправить позже, но когда его повторную передачу, .done() /. Сбой() оригинал обратного вызова должен быть вызван. С помощью опции «success» callback этот код работает нормально.

+1

Не уверен, что именно вы запрашиваете, но вы можете установить свойство 'context' для вас ajax-объекта, который будет передан обратно во все обратные вызовы. Вы можете хранить все, что хотите. –

+0

@JimCote Я хочу вставить ajax-вызов (основанный в состоянии) для повторной отправки позже, но при повторном отправке его необходимо вызвать .done() /. Fail(), который должен быть вызван изначального обратного вызова, попробуйте выполнить мой код. Когда вы используете параметры успеха, он работает нормально, но не работает с .done(). –

+0

Я только использовал свойства 'success' и' complete' объекта ajax (так же, как вы использовали 'error'). –

ответ

0

Я использую это для задержки AJAX запросов:

Глобального вариант:

var origSend = XMLHttpRequest.prototype.send; 
XMLHttpRequest.prototype.send = function() { 
    var xhr = this; 
    var origArguments = arguments; 
    setTimeout(function() { 
     if (xhr.readyState === 1) { 
      origSend.apply(xhr, origArguments); 
     } 
    }, 1000); 
}; 

Vairant, которая затрагивает только JQuery AJAX запросы:

$(document).ajaxSend(function (event, jqxhr, settings) { 
    var origXhrFunc = settings.xhr; 
    settings.xhr = function() { 
     var xhr = origXhrFunc(); 
     var origSend = xhr.send; 
     xhr.send = function() { 
      var origArguments = arguments; 
      setTimeout(function() { 
       if (xhr.readyState === 1) { 
        origSend.apply(xhr, origArguments); 
       } 
      }, 1000); 
     }; 
     return xhr; 
    }; 
}); 

В решении JQuery, вы можете легко прикрепить обработчик к событиям jqxhr done/fail/progress.