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

187

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

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

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

function getRemote() {

    var remote;

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

    return remote;

}
промышленные
источник
Ваш код выглядит хорошо. что это возвращает? Есть ли ошибки JS?
ShankarSangoli
11
Я нахожу это довольно ироничным - вы спрашиваете, как выполнить операцию «Асинхронный JavaScript и XML» синхронно. То, что вам действительно нужно выполнить, это "SJAX".
VitalyB
3
Примечание: спецификация начала осаждать синхронные запросы AJAX.
Лео Лам
2
кажется, что выражение «[синхронный] будет необходимо» указывает на отсутствие понимания движков JavaScript, поэтому приложение плохо спроектировано. Я хотел бы понять, есть ли случаи, когда синхронизация действительно требуется.
pmont
15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.Или очень хорошее понимание: если вы хотите сделать AJAX-вызов onbeforeunload, использование синхронного запроса на самом деле является рекомендуемым способом (так как окно браузера было бы пропущено до того, как запрос вернется в противном случае). В любом случае он ясно говорит: «Я знаю о плюсах и минусах использования синхронных вызовов ajax» ... Может, просто поверить ему?
Стейн де Витт

Ответы:

298

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

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

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

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

Хром:

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

Fire Fox:

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

Dogbert
источник
16
Обратите внимание, что responseTextвсегда возвращает строку. Если вы ждете JSON, завернуть $.ajaxс JSON.parse.
usandfriends
6
Примечание: xhr.spec.whatwg.org/#the-open()-method Синхронные запросы устарели ...
teynon
5
@Tom И так были <i>и <b>теги. Моя рекомендация: продолжайте использовать эти функции, чтобы они не исчезли.
Стейн де Витт
1
так как это блокирует браузер, имеет смысл добавить тайм-аут: 5000 или около того к опциям.
Commonpike
1
@usandfriends Для разбора строки на объект более безопасно использовать jQuery.parseJSON вместо JSON.parse stackoverflow.com/questions/10362277/…
AntonE
33

Вы используете функцию 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;
Мозг
источник
Ага! Тот же домен и все. remote_urlопределяется правильно, и вызов AJAX выполняется правильно, как указано (управляется с помощью firebug). Просто нет возврата!
Индастриал
3
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;
        }
    });
}
user3116547
источник
7
Пожалуйста, включите некоторые объяснения, почему это поможет ФП.
крильгар
Рекомендуется возвращать объект json со стороны сервера. Это дает вам больше контроля. Но вам нужно добавить dataType: "json" к вашим параметрам $ .ajax выше.
jjwdesign
Что это значит: «Это дает вам больше контроля»?
grantwparks
3
Не связано, но вы можете: return result.valid; // Это уже логическое значение
dpineda