Можно ли прервать синхронный запрос XmlHttpRequest? - PullRequest
5 голосов
/ 22 сентября 2011

Я написал функцию JavaScript, которая асинхронно вызывает веб-сервис, используя XmlHttpRequest. Меня попросили заставить эту функцию завершить свою работу до отображения страницы.

Я думал, что мог бы сделать синхронный запрос AJAX, но я не хочу, чтобы это заставляло страницу зависать слишком долго - я хотел бы отменить запрос, скажем, через 1 секунду, если ответ не получен.

Можно ли прервать синхронный запрос XmlHttpRequest?

Ответы [ 4 ]

4 голосов
/ 22 сентября 2011

Вы не можете:

http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX sais: «Синхронный AJAX (на самом деле SJAX - синхронный Javascript и XML) является модальным, что означает, что javascript остановит обработку вашей программы, пока результат не будетбыл получен с сервера. Во время обработки запроса браузер фактически заморожен. Браузер обрабатывает вызов как окно предупреждения или окно приглашения, только если он не ожидает ввода от пользователя, но вводит удаленный сервер"

Как только браузер выполнит запрос синхронизации, он будет ждать ответа.

2 голосов
/ 22 сентября 2011

Прежде всего, синхронные вызовы AJAX являются злом, потому что они блокируют весь механизм браузера JavaScript (о котором вы знаете).

Просто выполняет вызов асинхронно и отбрасывает результат, если он прибывает позже, чемчерез секунду мало?Если вы действительно хотите дождаться результата, вы все равно можете использовать setTimeout() (jQuery для удобства, не требуется):

var result;
var xhr = $.ajax('/url', function(response) {
  result = response;
});
setTimeout(function() {
  if(result) {
    //AJAX call done within a second, proceed with rendering
  } else {
    //One second passed, no result yet, discard it and move on
    xhr.abort();
  }
}, 1000);

При таком подходе вы не блокируете браузер, пока у вас его нетждать вызова AJAX.

1 голос
/ 22 сентября 2011

XMLHttpRequest метод поддержки abort, вы можете получить более подробную информацию об этом здесь: http://www.w3.org/TR/XMLHttpRequest/#the-abort-method

Но вам нужно проверить, сколько браузеров поддерживают его.Например, abort было введено в Windows Internet Explorer 7 и выше.

До или после вызова send() метода объекта XMLHttpRequest вы можете установить таймер на n-секундную задержку, которая будет прерывать асинхронныйоперация, которая выполняется.

0 голосов
/ 12 марта 2013

Это возможно в IE. Использование свойства timeout.

код ниже работал для меня

xmlhttp.open("method","url",false);
xmlhttp.timeout="time in ms";
xmlhttp.ontimeout=function(){};
xmlhttp.send();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...