Функция JavaScript, которая возвращает данные вызова AJAX

Я хотел бы создать функцию JavaScript, которая возвращает значение вызова jQuery AJAX. Мне хотелось бы что-то вроде этого.

function checkUserIdExists(userid){
    return $.ajax({
        url: 'theurl',
        type: 'GET',
        cache: false,
        data: {
           userid: userid
        },
        success: function(data){
            return data;
        }
    });
}

Я знаю, что могу сделать это, установив async в false, но я бы предпочел не делать этого.

Ответ 1

С помощью jQuery 1.5 вы можете использовать совершенно новую функцию $.Deferred, которая предназначена именно для этого.

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.ajax({ url: "example.php" })
    .success(function() { alert("success"); })
    .error(function() { alert("error"); })
    .complete(function() { alert("complete"); });

// perform other work here ...

// Set another completion function for the request above
jqxhr.complete(function(){ alert("second complete"); });

Источник

Ответ 2

Вы не можете вернуть данные, возвращенные вызовом AJAX, если вы не хотите его синхронно называть (а вы не доверяете мне). Но то, что вы можете вернуть, - это обещание данных, возвращаемых вызовом AJAX, и вы можете сделать это на самом деле очень элегантным способом.

( UPDATE: Обратите внимание, что в настоящее время jQuery Promises несовместим с Promises/A + спецификация - больше информации в этот ответ.)

В принципе вы можете вернуть возвращаемое значение вашего вызова $.ajax(...):

function checkUserIdExists(userid){
    return $.ajax({
        url: 'theurl',
        type: 'GET',
        cache: false,
        data: {
           userid: userid
        }
    });
}

и тот, кто вызывает вашу функцию, может использовать его следующим образом:

checkUserIdExists(userid).success(function (data) {
    // do something with data
});

См. этот пост для лучшего объяснения и демонстраций, если вы заинтересованы.

Ответ 3

вы можете передать функцию обратного вызова:

function checkUserIdExists(userid, callback) {
    $.ajax({
        ...
        success: callback
    });
}

checkUserIdExists(4, function(data) {

});

Ответ 4

Как и в jQuery 1.8, "успешный", "ошибка" и "полный" обратный вызов устарели. Вместо этого вы должны использовать "done", "fail" и "always".

Итак, вы могли бы:

function checkUserIdExists(userid, callback) {
        return $.ajax({
        url: 'theurl',
        type: 'GET',
        cache: false,
        data: {
           userid: userid
        }
    })
    .done(callback)
    .fail(function(jqXHR, textStatus, errorThrown) {
        // Handle error
    });
}

checkUserIdExists(2, function(data) {
    console.log(data); // Do what you want with the data returned
});

Ответ 5

Это не то, как должно было быть сделано асинхронное программирование JavaScript. Вместо этого используйте обратный вызов в своей функции успеха, чтобы вызвать другую функцию для использования ваших данных, возвращенных с сервера.

Ответ 6

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

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