我编写了一个“运行php查询”的jQuery / JS函数。
function runQuery(op){
if(op.type == "edit"){
var b = false;
if(op.id != "" && (op.fromSong || op.toSong || op.when || op.comment)){
$.post("processor.php", { id: op.id, type: "edit", fromSong: op.fromSong, toSong: op.toSong, when: op.when, comment: op.comment }, function(data){
if(data == true){
console.log(true);
b = true;
}else{
console.log(false);
b = false;
}
});
}
return b;
}
我希望它根据服务器的答案返回false。我确信php脚本正常工作并正确返回true或false。但每次运行该函数时,console.log()都会输出正确的值,这与变量b不同。它似乎总是错误的。我做错了什么?
答案 0 :(得分:3)
由于任何.ajax()
调用($.post
只是$.ajax
的包装)运行异步,因此您的变量b
将始终返回{{ 1}}。 “解决方法”的最佳方法是传递另一个回调:
false
答案 1 :(得分:0)
是的,这是错误的。
$。post是异步完成的,因此在回调中设置了b,但在到达回调之前返回了。
您应该使用$.ajax
代替method:"POST"
和async: false
然而,仅在回调中使用b
的值时进行设计可能会更好,因为async: false
可能会冻结您的浏览器。
答案 2 :(得分:0)
您的函数将在对服务器的异步请求完成之前返回。在你提出要求之前,使调用同步是不切实际和不可取的,这样你就可以从函数中返回true / false。您可以考虑为函数提供回调参数:
function runQuery(op, success, failure){
// ...
if(data == true){
success();
}else{
failure();
}
// ...
}
runQuery('edit',
function () { alert('success!'); },
function () { alert('failure!'); }
);
答案 3 :(得分:0)
这是一种错误的方法。 Ajax请求是异步的,并不像您期望的那样一个接一个地执行。没有办法解决这个问题。您将不得不重新设计代码以嵌套ajax调用。
类似的东西:
$.post("a.php", {function(data){
//1st check
$.post("b.php", {function(data){
//2nd check
$.post("c.php", {function(data){
//final actions
});
});
});
只有这样才能堆叠ajax调用 - 下一个调用将在前一个调用之后执行。
答案 4 :(得分:0)
您的.ajax()调用是异步的。 如果要在继续执行代码之前等待响应,可以考虑使调用同步:
$.ajaxSetup({async:false});
最好是重构代码以使回调将结果(b)传递给使用它的方法,以便稍后在帖子完成时发生。