Как вернуть значение при успешном запросе AJAX [дубликат]
этот вопрос уже есть ответ здесь:
function ajaxRefresh(actionUrl) {
$.ajax({
url: actionUrl,
success: function() {
return true;
}});
return false;
}
функция в любом случае возвращает false
даже если запрос выполнен успешно, becouse запрос является асинхронным. Как я могу вернуться!--2--> когда запрос успешно?
6 ответов
вы должны установить параметр async
to false
. Попробуйте этот код:
function ajaxRefresh(actionUrl) {
var succeed = false;
$.ajax({
async: false,
url: actionUrl,
success: function() {
succeed = true;
}});
return succeed;
}
вы не можете вернуть "true", пока запросы ajax не закончатся, потому что это asynchron, как вы упомянули. Таким образом, функция сохраняется до завершения запроса ajax.
Решение 1
function ajaxRefresh(actionUrl, successCallback) {
$.ajax({
url: actionUrl,
success: successcallback
});
}
но есть обходной путь: просто добавьте параметр обратного вызова в функцию. Эта функция будет выполнена по завершении запроса.
решение 2
вы можете вернуть отложенный jquery.
function ajaxRefresh(actionUrl, successCallback) {
return $.ajax({
url: actionUrl
});
}
Теперь вы можете использовать функции как:
function otherFunction()
{
ajaxRefresh().success(function() {
//The ajax refresh succeeded!
}).error(function() {
//There was an error!
});
}
для получения дополнительной информации о jQuery deferreds посмотрите наhttp://www.erichynds.com/jquery/using-deferreds-in-jquery/.
вы можете выполнить рефакторинг кода немного, так что ваш успех обратного вызова срабатывает следующая операция, которая зависит от истинного/ложного результата. Например, если у вас есть что-то вроде:
function main() {
// some code
if (ajaxRefresh(url)) {
// do something
}
}
вы бы изменили это на что-то вроде:
function main() {
// some code
ajaxRefresh(url);
}
function doSomething(successFlag) {
if (successFlag) {
// do something
}
}
function ajaxRefresh(actionUrl) {
$.ajax({
url: actionUrl,
success: function() {
doSomething(true); // or false as appropriate
}});
}
вы также можете поставить if
проверьте функцию обратного вызова ajax вместо . Вам решать.
или вы можете сделать синхронный запрос и выяснить ajaxRefresh()
возвращаемое значение функции после выполнения запроса. Я бы не рекомендовал этого для большинства целей.
Я относительно новичок в этом, но вот предлагаемая работа, которую я придумал, которая устраняет необходимость устанавливать asynch
в false или что-то в этом роде. Просто установите скрытое значение поля с результатом вызова ajax и вместо проверки возвращаемого значения проверьте значение скрытого поля на true / false (или что вы хотите в него поместить).
пример: сделать функция() {
$.ajax({
...blah blah
},
success: function(results) {
if(results === 'true') {
$('#hidField').val('true');
}
else {
$('#hidField').val('false');
}
}
});
тогда где-то еще, где это требуется, это doSomething
вызывается функция, и вместо проверки результата вызова ajax найдите значение скрытого поля:
doSomething();
var theResult = $('#hidField').val();
if (theResult == 'true') {
...do whatever...
}
использовать функции обратного вызова
Очереди Функций Обратного Вызова: -
параметры beforeSend, error, dataFilter, success и complete принимают функции обратного вызова, которые вызываются в соответствующее время.
Так вот
function ajaxRefresh(actionUrl) {
$.ajax({
url: actionUrl,
success: function() {
return true;
}
error:function(){
return false;
}
});
}
вы можете получить более подробную информацию здесь
function ajaxRefresh(actionUrl) {
bool isSucesss=false;
$.ajax({
url: actionUrl,
success: function() {
isSucesss=true;
},
error:function() {
isSucesss= false;
}
});
return isSucesss;
}