JQuery: Выполнение синхронных запросов AJAX

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

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

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

function getRemote() {

    var remote;

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

    return remote;

}

Ответ 1

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

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/

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;

Ответ 5

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;
        }
    });
}

Ответ 6

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

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