我有一个功能:
function add() {
$.ajax({
type: "POST",
url: "add.php",
async: "false", // Tried both- async: "false/true"
data: {
name: 'Test',
},
success: function(data) {
document.getElementById('id').value = data;
id = document.getElementById('id').value;
alert(id); // alerts here proper value
}
});
}
function testMyFunction() {
add();
// 'id' was set in add function.
id = document.getElementById('id').value;
alert(id); // Here does not alert value but blank(no value)
// This 'id' value is used at other place but here is issue.
}
调用testMyFunction()函数给出了上述问题。
可能是什么问题?
答案 0 :(得分:3)
$ .ajax是一个异步调用,它会更新" id"完成之后的字段。您的代码在调用之后立即检查函数testMyFunction()中的值(在成功之前:调用函数(数据))。
答案 1 :(得分:3)
JavaScript是一种异步语言。简而言之,这意味着您的代码应 NEVER 阻止:函数应立即完成或稍后调用,即在某些输入/输出操作完成后(例如AJAX请求)。
编辑: BTW,您的代码无效,因为即使使用async: false
,事件循环中也会调用success
函数,因此即使在同步AJAX之后的代码之后也会发生。如果您使用async: true
,AJAX将会阻止,但success
函数在任何情况下都将被称为异步。
因此,要同步处理数据,您必须不使用success
函数,而是使用$.ajax()
调用返回的对象:
var xhr = $.ajax({
type: "POST",
async: false,
url: "add.php",
data: {
name: 'Test',
},
});
alert(xhr.responseText); // Alerts result
因此,您应永远使用async: false
。相反,更好地重构您的代码:
function add(callback) {
$.ajax({
type: "POST",
url: "add.php",
data: {
name: 'Test',
},
success: callback
});
}
function testMyFunction() {
add(function(data) {
// This closure will be called AFTER the request is complete.
document.getElementById('id').value = data;
alert(data); // Alerts proper value.
});
}
基本上,这个伪代码是错误的:
result1 = action1();
result2 = action2(result1);
result3 = action3(result2);
......应该这样写:
action1(function(result1) {
action2(result1, function(result2) {
alert(action3(result2));
});
});