Функция 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