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, таким чином, погано зосереджене додаток. Я хотів би зрозуміти, чи є випадки, коли дійсно потрібна синхронізація.
пмонт

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

УВАГА! Примітка. Встановлення властивості асинхронізації на значення false застаріле, і в процесі видалення ( посилання ). Багато браузерів, включаючи Firefox та Chrome, вже почали друкувати попередження на консолі, якщо ви користуєтесь цим:

Chrome:

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

Firefox:

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


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 / ...
Антоне

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

7
Будь ласка, додайте пояснення, чому це допоможе ОП.
krillgar

Добре практично повертати об’єкт json з боку сервера. Це дає вам більше контролю. Але вам потрібно додати dataType: "json" до параметрів $ .ajax вище.
jjwdesign

Що це означає: "Це дає вам більше контролю"?
grantwparks

3
Не пов’язано, але ви можете: повернути результат.валидне; // Це вже
буле
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.