Используя jQuery, как я могу отменить/прервать запрос Ajax, на который я еще не получил ответ?
Отменить запросы Ajax с помощью jQuery
Ответ 1
Большинство методов jQuery Ajax возвращают объект XMLHttpRequest (или эквивалентный), поэтому вы можете просто использовать abort()
.
См. Документацию:
- метод прерывания (MSDN). Отменяет текущий HTTP-запрос.
- abort() (MDN). Если запрос уже отправлен, этот метод прервет запрос.
var xhr = $.ajax({
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});
//kill the request
xhr.abort()
UPDATE: с jQuery 1.5 возвращаемый объект является оболочкой для собственного объекта XMLHttpRequest, называемого jqXHR. Этот объект, как представляется, раскрывает все собственные свойства и методы, поэтому приведенный выше пример все еще работает. См . Объект jqXHR (документа API jQuery).
ОБНОВЛЕНИЕ 2: Начиная с jQuery 3, метод ajax теперь возвращает обещание с дополнительными методами (например, прерывание), поэтому приведенный выше код все еще работает, хотя возвращаемый объект больше не является xhr
. См. Блог 3.0 здесь.
ОБНОВЛЕНИЕ 3: xhr.abort()
все еще работает с jQuery 3.x. Не предполагайте, что обновление 2 является правильным. Дополнительная информация о репозитории jQuery Github.
Ответ 2
Вы не можете вспомнить запрос, но вы можете установить значение тайм-аута, после которого ответ будет проигнорирован. См. Эту страницу для параметров jQuery AJAX. Я считаю, что ваш обратный вызов будет вызываться, если превышен период ожидания. Для каждого запроса AJAX уже установлен тайм-аут по умолчанию.
Вы также можете использовать метод abort() объекта запроса, но, в то время как это заставит клиента прекратить прослушивание события, он может, вероятно, не остановит сервер от его обработки.
Ответ 3
Это запрос асинхронный, что означает, что он отправил его там.
В случае, если ваш сервер начинает очень дорогостоящую операцию из-за запроса AJAX, самое лучшее, что вы можете сделать, это открыть ваш сервер для прослушивания запросов на отмену и отправить отдельный запрос AJAX, уведомляющий сервер, чтобы остановить все, что он делает.
В противном случае просто игнорируйте ответ AJAX.
Ответ 4
Сохраните вызовы, которые вы делаете в массиве, затем вызовите xhr.abort() для каждого из них.
HUGE CAVEAT: вы можете прервать запрос, но это только клиентская сторона. Серверная сторона все еще может обрабатывать запрос. Если вы используете что-то вроде PHP или ASP с данными сеанса, данные сеанса блокируются до завершения ajax. Таким образом, чтобы позволить пользователю продолжить просмотр веб-сайта, вы должны вызвать session_write_close(). Это сохраняет сеанс и разблокирует его, чтобы продолжить работу других страниц, ожидающих продолжения. Без этого несколько страниц могут ожидать, что блокировка будет удалена.
Ответ 5
Запросы AJAX могут не выполняться в том порядке, в котором они были запущены. Вместо прерывания вы можете игнорировать все ответы AJAX, за исключением последнего:
- Создать счетчик
- Увеличение счетчика при запуске запроса AJAX
- Используйте текущее значение счетчика для "штампа" запроса
- В обратном вызове успеха сравните штамп со счетчиком, чтобы проверить, был ли он самым последним запросом
Грубая схема кода:
var xhrCount = 0;
function sendXHR() {
// sequence number for the current invocation of function
var seqNumber = ++xhrCount;
$.post("/echo/json/", { delay: Math.floor(Math.random() * 5) }, function() {
// this works because of the way closures work
if (seqNumber === xhrCount) {
console.log("Process the response");
} else {
console.log("Ignore the response");
}
});
}
sendXHR();
sendXHR();
sendXHR();
// AJAX requests complete in any order but only the last
// one will trigger "Process the response" message
Ответ 6
Нам просто нужно было решить эту проблему и протестировать три разных подхода.
- отменяет запрос, предложенный @meouw
- выполнить весь запрос, но обрабатывает только результат последнего отправления
- предотвращает новые запросы до тех пор, пока другой еще не выполняется
var Ajax1 = {
call: function() {
if (typeof this.xhr !== 'undefined')
this.xhr.abort();
this.xhr = $.ajax({
url: 'your/long/running/request/path',
type: 'GET',
success: function(data) {
//process response
}
});
}
};
var Ajax2 = {
counter: 0,
call: function() {
var self = this,
seq = ++this.counter;
$.ajax({
url: 'your/long/running/request/path',
type: 'GET',
success: function(data) {
if (seq === self.counter) {
//process response
}
}
});
}
};
var Ajax3 = {
active: false,
call: function() {
if (this.active === false) {
this.active = true;
var self = this;
$.ajax({
url: 'your/long/running/request/path',
type: 'GET',
success: function(data) {
//process response
},
complete: function() {
self.active = false;
}
});
}
}
};
$(function() {
$('#button').click(function(e) {
Ajax3.call();
});
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="button" type="button" value="click" />
Ответ 7
Всегда лучше делать что-то подобное.
var $request;
if ($request != null){
$request.abort();
$request = null;
}
$request = $.ajax({
type : "POST", //TODO: Must be changed to POST
url : "yourfile.php",
data : "data"
}).done(function(msg) {
alert(msg);
});
Но гораздо лучше, если вы проверите оператор if, чтобы проверить, является ли запрос ajax нулевым или нет.
Ответ 8
meouw solution является правильным, но если вы заинтересованы в большем контроле, вы можете попробовать Плагин Ajax Manager для jQuery.
Ответ 9
Просто позвоните xhr. abort() - это объект jquery ajax или собственный объект XMLHTTPRequest.
пример:
//jQuery ajax
$(document).ready(function(){
var xhr = $.get('/server');
setTimeout(function(){xhr.abort();}, 2000);
});
//native XMLHTTPRequest
var xhr = new XMLHttpRequest();
xhr.open('GET','/server',true);
xhr.send();
setTimeout(function(){xhr.abort();}, 2000);
Ответ 10
Я занимался поиском в реальном времени и требовал отменить ожидающие запросы, которые, возможно, заняли больше времени, чем последний/самый последний запрос.
В моем случае я использовал что-то вроде этого:
//On document ready
var ajax_inprocess = false;
$(document).ajaxStart(function() {
ajax_inprocess = true;
});
$(document).ajaxStop(function() {
ajax_inprocess = false;
});
//Snippet from live search function
if (ajax_inprocess == true)
{
request.abort();
}
//Call for new request
Ответ 11
Как отмечают многие люди в потоке, только потому, что запрос прерывается на стороне клиента, сервер все равно обработает запрос. Это создает излишнюю нагрузку на сервер, потому что он выполняет работу, которую мы перестали слушать в интерфейсе.
Проблема, которую я пыталась решить (другие могут зайти в нее), заключается в том, что когда пользователь вводил информацию в поле ввода, я хотел, чтобы я попросил у вас запрос на мгновенный тип Google Instant.
Чтобы избежать стрельбы ненужными запросами и поддерживать привязанность внешнего интерфейса, я сделал следующее:
var xhrQueue = [];
var xhrCount = 0;
$('#search_q').keyup(function(){
xhrQueue.push(xhrCount);
setTimeout(function(){
xhrCount = ++xhrCount;
if (xhrCount === xhrQueue.length) {
// Fire Your XHR //
}
}, 150);
});
Это будет по существу отправлять один запрос каждые 150 мс (переменную, которую вы можете настроить для своих нужд). Если у вас возникли проблемы с пониманием того, что именно происходит здесь, запишите xhrCount
и xhrQueue
в консоли непосредственно перед блоком if.
Ответ 12
Просто используйте ajax.abort(), например, вы можете прервать любой ожидающий запрос ajax перед отправкой другого, подобного этому
//check for existing ajax request
if(ajax){
ajax.abort();
}
//then you make another ajax request
$.ajax(
//your code here
);
Ответ 13
нет надежного способа сделать это, и я даже не попробую его, как только запрос будет в пути; единственный способ реагировать разумно - это игнорировать ответ.
в большинстве случаев это может произойти в таких ситуациях, как: пользователь слишком часто нажимает кнопку на кнопке, запускающей много последовательных XHR, здесь у вас есть много вариантов, либо блокируйте кнопку до тех пор, пока XHR не вернется, либо даже не вызовет новый XHR, а другой работает, намекая, чтобы пользователь наклонился назад - или отменил ожидающий XHR-ответ, но недавний.
Ответ 14
Вы можете прервать любой непрерывный вызов ajax, используя этот
<input id="searchbox" name="searchbox" type="text" />
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
var request = null;
$('#searchbox').keyup(function () {
var id = $(this).val();
request = $.ajax({
type: "POST", //TODO: Must be changed to POST
url: "index.php",
data: {'id':id},
success: function () {
},
beforeSend: function () {
if (request !== null) {
request.abort();
}
}
});
});
</script>
Ответ 15
В следующем коде показано инициирование, а также прерывание запроса Ajax:
function libAjax(){
var req;
function start(){
req = $.ajax({
url: '1.php',
success: function(data){
console.log(data)
}
});
}
function stop(){
req.abort();
}
return {start:start,stop:stop}
}
var obj = libAjax();
$(".go").click(function(){
obj.start();
})
$(".stop").click(function(){
obj.stop();
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="button" class="go" value="GO!" >
<input type="button" class="stop" value="STOP!" >
Ответ 16
У меня возникла проблема опроса, и как только страница была закрыта, опрос продолжался, поэтому по моей причине пользователь пропустил обновление, поскольку значение mysql устанавливалось на следующие 50 секунд после закрытия страницы, хотя я убил ajax запрос, я понял, что при использовании $_SESSION для установки var не будет обновляться в опросе, пока он не закончится, а новый не запустится, поэтому я сделал значение в моей базе данных как 0 = offpage, тогда как Я опроса Я запрашиваю эту строку и возвращаю false; когда он 0 как запрос в опросе, вы получите текущие значения, очевидно...
Я надеюсь, что это помогло
Ответ 17
Я поделился демонстрацией которая демонстрирует, как отменить запрос AJAX - если данные не возвращаются с сервера в течение предопределенного времени ожидания.
HTML:
<div id="info"></div>
JS CODE:
var isDataReceived= false, waitTime= 1000;
$(function() {
// Ajax request sent.
var xhr= $.ajax({
url: 'http://api.joind.in/v2.1/talks/10889',
data: {
format: 'json'
},
dataType: 'jsonp',
success: function(data) {
isDataReceived= true;
$('#info').text(data.talks[0].talk_title);
},
type: 'GET'
});
// Cancel ajax request if data is not loaded within 1sec.
setTimeout(function(){
if(!isDataReceived)
xhr.abort();
},waitTime);
});
Ответ 18
Если xhr.abort();
вызывает перезагрузку страницы,
Затем вы можете установить onreadystatechange
перед тем, как прервать, чтобы предотвратить:
// ↓ prevent page reload by abort()
xhr.onreadystatechange = null;
// ↓ may cause page reload
xhr.abort();
Ответ 19
Существует фиктивное решение, которое я использую для отмены всех запросов AJAX. Это решение перезагрузить всю страницу. Это решение хорошо, если вам не нравится присваивать ID каждому запросу ajax, и если вы делаете запросы ajax внутри цикла for. Это обеспечит уничтожение всех запросов AJAX.
location.reload();
Ответ 20
$.ajax({
type: "POST",
url: "handlername",
data: "paramerers",
success: function(msg){
alert( "Result: " + msg );
},
error: function() {
alert("Error Message");
},
datatype : JSON,
async: false,
cache: false
});