Задержка запроса JQuery Ajax (jqXHR) с обратными вызовами done/fail/complete
Когда я использую обратный вызов успеха, это решение работает нормально, но когда я использую.done (), это не удается, как я могу повторить попытку отправить ajax-запрос в очереди с оригинальными зарегистрированными обратными вызовами.done ().fail () и complete()?
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()/. Fail (). С опцией обратного вызова "success" этот код работает нормально.
1 ответ
Я использую это для задержки запросов 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.