Как я могу сделать синхронный запрос с JQuery? - PullRequest
4 голосов
/ 04 февраля 2011

Почему бы не вернуть эту функцию responseText?

function LoadBookmarksAsXml()
{
  return $.ajax(
  {
    type: 'GET',
    async: false,
    url:  'http://www.google.com/bookmarks/?output=xml&num=10000'
  }).responseText;
}

(Это работает, если я определил функцию success-callback и установил async в true!) Заранее спасибо !!

Редактировать : Не беспокойтесь о междоменном вызове;user603003 говорит (в комментарии к удаленному ответу), что это расширение Chrome, где разрешены междоменные запросы.

Решение, если кто-то хочет сделать то же самое:

return $.ajax(
{
  type: 'GET',
  async: false,
  url:  'http://www.google.com/bookmarks/?output=xml&num=10000',
});

(Вы получите объект XMLHTTPRequest.)

Ответы [ 5 ]

10 голосов
/ 04 февраля 2011

Я не сразу понимаю, почему он не возвращает его, но я все равно использовал бы обратный вызов success:

function LoadBookmarksAsXml()
{
  var result;
  $.ajax(
  {
    type: 'GET',
    async: false,
    url:  'http://www.google.com/bookmarks/?output=xml&num=10000',
    success: function(data) {
        result = data;
    }
  });
  return result;
}

Даже если $.ajax возвращает объект XMLHttpRequest (в версии 1.4 или более ранней) или объект jqXHR (в версии 1.5+), я все же предпочел бы использовать функцию success и функцию error для ясность. Кроме того, разные версии jQuery дают разные значения для responseText при ошибке (по крайней мере, в Chrome; 1.4.4 возвращает пустую строку, 1.5.0 возвращает undefined).


Если есть , каким-либо образом вы можете избежать этого , избегайте его. Синхронные запросы полностью блокируют пользовательский интерфейс большинства браузеров (не только пользовательский интерфейс вашей страницы, каждую страницу каждой вкладки, которой управляет браузер). Поскольку запросы Ajax могут занимать секунду или две (или пять, или десять), это создает очень неприятный пользовательский опыт. Почти все время вы можете избежать этого путем рефакторинга вашей функции, чтобы она принимала обратный вызов для использования для предоставления результата:

function LoadBookmarksAsXml(callback)
{
  $.ajax(
  {
    type: 'GET',
    url:  'http://www.google.com/bookmarks/?output=xml&num=10000',
    success: function(data) {
        callback(data);
    },
    error: function() {
        callback(null);
    }
  });
}

Не по теме : я буду удивлен, если запрос вообще будет работать, потому что, на первый взгляд (если вы не работаете в Google), этот запрос не будет выполнен из-за Та же политика происхождения . Различные способы обойти СОП:

1 голос
/ 04 февраля 2011

$.ajax никогда не возвращает текст ответа, он всегда возвращает объект XMLHTTPRequest, созданный для выполнения вызова Ajax.

Вам все равно нужно будет определить успешный обратный вызов, я думаю, например, один установив локальную переменную, которую вы затем сможете вернуть.

Стандартный отказ от ответственности: синхронные запросы обычно не рекомендуется, посколькузаморозить текущую страницу.

0 голосов
/ 04 февраля 2011

По своей конструкции асинхронные запросы не могут доставить responseText на ровном месте ;-) Вам необходимо установить функцию обратного вызова и решить, как вы будете обрабатывать responseText.

0 голосов
/ 04 февраля 2011

Это действительно плохая идея.Javascript будет блокироваться на время HTTP-запроса, то есть ничего другого в потоке пользовательского интерфейса не будет работать до тех пор, пока не вернется вызов ajax.Используйте обратный звонок.

0 голосов
/ 04 февраля 2011

Ожидание ответа функции не является асинхронным, вызов ajax будет иметь ответ, когда он будет завершен, вы должны позаботиться об ответе, определив обратные вызовы для успешного события.

Вы должны разбить свой код как минимум на две части.Первая часть находится перед вызовом ajax, вторая часть - после успеха и помещает все, что вы хотите сделать с запрошенными данными, в обратный вызов успеха.Так работают асинхронные запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...