Ajax JQuery синхронный обратный вызов успеха
У меня есть эта функция, которая делает вызов AJAX. Я описываю проблему в последнем фрагменте комментариев к коду.
function doop(){
var that = this;
var theold = "theold";
var thenew = "thenew";
$.ajax({
url: 'doop.php',
type: 'POST',
data: 'before=' + theold + '&after=' + thenew,
success: function(resp) {
if(resp == 1) {
$(that).siblings('.theold').html(thenew);
}
}
});
// I have some code here (out of the ajax) that **further** changes
// the .theold's html beyond what it was changed inside ajax success
// but the change depends on whether the resp (inside the success
// function) returned 1 or not, so this code out here depends on the ajax
// so it looks like I have to turn this ajax call into a sync ajax
return false;
}
Исходя из проблемы, описанной в комментариях к коду, какие изменения лучше всего подходят для этой ситуации?
3 ответа
Вам нужно установить async: false для синхронных запросов, таких как:
function doop(){
var that = this;
var theold = $(this).siblings('.theold').html();
var thenew = $(this).siblings('.thenew').val();
$.ajax({
async: false,
url: 'doop.php',
type: 'POST',
data: 'before=' + theold + '&after=' + thenew,
success: function(resp) {
if(resp == 1) {
$(that).siblings('.theold').html(thenew);
}
}
});
// some other code
return false;
}
смотрите здесь для деталей
Либо установите вызов Ajax в синхронный режим, как указала Стефита, либо просто перенесите свой код в обратный вызов успеха. Почему ты не можешь сделать это? Даже если это еще один вызов Ajax, это все же можно сделать - вы можете вкладывать их. С информацией, предоставленной вами до сих пор (я не вижу проблемный код, или у меня недостаточно знаний о вашем проекте), я не вижу проблемы, на самом деле.
Я предпочитаю использовать обратный вызов для выполнения этой работы, потому что он достигает точно такого же результата, фактически не делая его синхронным. Я использую success:callback, а затем передаю обратный вызов в качестве параметра.
function getData(callback) {
$.ajax({
url: 'register/getData',
data: "",
dataType: 'json',
success: callback
});
}
Затем я вызываю эту функцию так:
getData(function(data){
console.log(data); //do something
});