Дождитесь ответа на вызов jquery ajax от вызывающей функции
Я просмотрел много ответов на этот вопрос, и теперь я смущен относительно наилучшего способа. Учитывая последний jquery, я хочу
- Вызов функции ajax
- выполнить обработку ajax (успех или ошибка)//отлично работает
- при успешном выполнении или ошибке возвращает статус вызывающей функции для дальнейшей обработки
в вызывающей функции (doAjax), как я могу подождать обратного вызова, а затем завершить обработку для успеха или ошибки (в этом случае его успех удалит форму, по ошибке сохраните ее как есть)
спасибо для любых советов,
Искусство
[EDIT]
Там была опечатка, как вы, ребята, заметили, звонок должен был быть doAnAjax not doAjax
$(function () {
doAnAjax(Url, data, function (myRtn) {
if (myRtn == "success") {
resetForm($('#myForm'));
resetForm($('form[name=addChlGrp]'));
} else {
$('.rtnMsg').html("Opps! Ajax Error");
}
});
});
function doAnAjax(newUrl, data) {
$.ajax({
url: newUrl,
async: true,
dataType: 'html',
beforeSend: function () {
$('.rtnMsg').html("<img src=_cssStyleImg_-A-loading.gif>");
},
type: "GET",
data: data,
cache: false,
success: function (data, textStatus, xhr) {
$('.rtnMsg').html(data);
myRtnA = "Success"
return myRtnA;
},
error: function (xhr, textStatus, errorThrown) {
$('.rtnMsg').html("opps: " + textStatus + " : " + errorThrown);
myRtnA = "Error"
return myRtnA;
}
});
}
Ответы
Ответ 1
Вы должны использовать функцию обратного вызова. Попробуйте следующее:
$(function() {
// I think doAjax should doAnAjax()
// here you're passing callback
// but you're not using it doAnAjax()
doAnAjax(Url, data, function(myRtn) {
if (myRtnV == "success") {
resetForm($('#myForm'));
resetForm($('form[name=addChlGrp]'));
} else {
$('.rtnMsg').html("Opps! Ajax Error");
}
});
});
// pass callback as third parameter to doAnAjax()
function doAnAjax(newUrl, data, callBack) {
$.ajax({
url: newUrl,
async: true,
dataType: 'html',
beforeSend: function() {
$('.rtnMsg').html("<img src=_cssStyleImg_-A-loading.gif>");
},
type: "GET",
data: data,
cache: false,
success: function(data, textStatus, xhr) {
$('.rtnMsg').html(data);
myRtnA = "Success"
return callBack( myRtnA ); // return callBack() with myRtna
},
error: function(xhr, textStatus, errorThrown) {
$('.rtnMsg').html("opps: " + textStatus + " : " + errorThrown);
myRtnA = "Error"
return callBack ( myRtnA ); // return callBack() with myRtna
}
});
Ответ 2
Как упоминалось ранее, использование обратных вызовов.
function process(url, params, successCallback, errorCallback) {
$.ajax({
success : successCallback,
error : errorCallback,
data : params,
url : url,
type : 'POST',
dataType : 'json'
});
}
process(
'http://www.google.co.uk',
{
param1 : 'a'
},
function(resp) {
alert('Success');
},
function() {
alert('Uh oh');
}
);
Затем вы можете передать любую функцию в process
, и она будет вызвана на успех/ошибку.
Ответ 3
Ответ: вы этого не делаете, но это легко достижимо. Идея AJAX заключается в асинхронности, поэтому A JAX. Это означает, что функция, которая изначально вызывает ваш ajax, не будет ждать завершения, и вместо этого вся работа будет завершена после того, как вызов ajax должен быть в обработчиках успеха или ошибок.
Если вам нужно что-то синхронное, вы можете изменить свой флаг от async:true
до async:false
, но тогда он станет действительно вызовом SJAX (даже не уверен, что этот термин существует, но технически он больше не является вызовом AJAX).
Ответ 4
Отметьте "derferred" в jquery. В приведенном ниже примере используется отложен. С асинхронным отключением и, похоже, работает для меня.!
$.ajax({
url: "http://www.whatever.com/whatever",
async: false }).done(function( data ) {
alert(data); //or whatever
})