jQuery: выполнение синхронных AJAX-запросов

159

В прошлом я делал некоторые jQuery, но я полностью застрял в этом. Я знаю о плюсах и минусах использования синхронных вызовов ajax, но здесь это потребуется.

Удаленная страница загружается (управляется с помощью Firebug), но возврат не отображается.

Что мне делать, чтобы моя функция вернулась правильно?

function getRemote() {

    var remote;

    $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });

    return remote;

}
  • 0
    Ваш код выглядит хорошо. что это возвращает? Есть ли ошибки JS?
  • 0
    Нету. Нет ошибок вообще!
Показать ещё 10 комментариев
Теги:
synchronous

6 ответов

267
Лучший ответ

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

function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}

Пример - http://api.jquery.com/jQuery.ajax/#example-3

ОБРАТИТЕ ВНИМАНИЕ: Значение свойства async для false равно устарело и в процессе удаления (ссылка). Многие браузеры, включая Firefox и Chrome, уже начали печатать предупреждение в консоли, если вы используете это:

Chrome:

Синхронный XMLHttpRequest в основном потоке устарел из-за его пагубных последствий для конечного пользователя. Для получения дополнительной справки проверьте https://xhr.spec.whatwg.org/.

Firefox:

Синхронный XMLHttpRequest в основном потоке устарел из-за его пагубных последствий для конечных пользователей. Для получения дополнительной справки http://xhr.spec.whatwg.org/

  • 14
    Обратите внимание, что responseText всегда возвращает строку. Если вы ожидаете JSON, $.ajax JSON.parse .
  • 6
    Примечание: xhr.spec.whatwg.org/#the-open()-method Синхронные запросы устарели ...
Показать ещё 9 комментариев
72

Я действительно ненавижу "Я не использую его или не согласен с ним, поэтому не стоит его использовать", - сказал Том. Почти так же плохо, как считают вредные эссе. Это напоминает мне о том, что люди спорят о одиночных или двойных кавычках на основе их предпочтений IDE, когда они действительно соответствуют стандартам.

У меня была проблема ajax, которая была решена только добавлением async: false, к ней. Использование зависаний браузеров в качестве предлога для аргументации для устаревания (и удаления) этой функции является глупым. Откуда вы знаете, как долго будет выполняться синхронный запрос ajax? Не все загружают или передают огромные объемы данных с этими вызовами.

Моя проблема была системой отслеживания, которую большинство браузеров не сообщало о том, что пользователи покинули страницу (onbeforeunload), но как только запрос ajax был синхронным, он работал на все, кроме Safari, на iOS и других устаревшие веб-браузеры конца жизни. Объем данных, которые я отправлял, был крайне незначителен, всего два целых числа, и это был запрос на локальный сервер. Повреждение для моего запроса вообще не примечательно, вам понадобятся средства мониторинга, чтобы их можно было заметить. Моей альтернативой синхронным вызовам ajax будут непрерывные вызовы ajax с помощью функции setInterval, которая значительно увеличивает нагрузку на сервер и пропускную способность. Вы не можете сделать аргумент, что ajax-вызов каждые N секунд лучше, чем один, когда кто-то выходит из страницы. Вы просто не можете.

Устаревание синхронных запросов - это наказание, установленное для всех веб-разработчиков, потому что некоторые из них использовали его безответственно.

  • 1
    я проголосовал за это, я просто хочу добавить, что Том связан с соответствующим документом, и там прямо говорится, что синхронные запросы вне рабочих будут удалены (не так близко) в будущем. Так что, нравится нам это или нет, нам придется с этим справиться.
  • 1
    хотя я согласен с тем, что удаление какой-либо функции просто ради нее является незрелым, я полагаю, что вы, возможно, сможете реализовать МОСТ код с помощью обратных вызовов / обещаний, даже если это выглядит не так красиво, как в синхронном стиле. Проблема в том, что иногда бывает довольно сложно и занимает много времени конвертировать готовую систему в этот стиль, и это может оказаться чем-то вроде проблемы. К счастью, в ES7 есть некоторые новые функции, которые вы должны посмотреть на jakearchibald.com/2014/es7 -асинхронные функции .
Показать ещё 3 комментария
28

Вы неправильно используете функцию ajax. Поскольку он синхронно, он вернет данные в строку следующим образом:

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;
17

насколько удален этот url? это из того же домена? код выглядит нормально

попробуйте это

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;
  • 0
    Ага! Тот же домен и все. remote_url определен правильно, и AJAX-вызов выполняется правильно, как указано (управляется с помощью firebug). Просто нет возврата!
2
function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success: function (result) {
            /* if result is a JSon object */
            if (result.valid)
                return true;
            else
                return false;
        }
    });
}
  • 4
    Пожалуйста, включите некоторые объяснения, почему это поможет ФП.
  • 0
    Рекомендуется возвращать объект json со стороны сервера. Это дает вам больше контроля. Но вам нужно добавить dataType: "json" к параметрам $ .ajax выше.
Показать ещё 2 комментария
-2

проверьте эти

function getRemote() {
    //var remote;
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });
    //return remote;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню