Функция 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, но я бы не стал.

6 ответов

Решение

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

Источник

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

(ОБНОВЛЕНИЕ: обратите внимание, что в настоящее время обещания jQuery не совместимы со спецификацией 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
});

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

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

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

checkUserIdExists(4, function(data) {

});

Начиная с jQuery 1.8, обратный вызов "success", "error" и "complete" устарели. Вместо этого вы должны использовать "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
});

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

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

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

Другие вопросы по тегам