Jquery中ajax的同步与异步
1、异步的调用方式:
开始我写的函数执行的过程是这样的(post会被异步的进行操作):
$.post("logic.php", {
type: "query_sql_get_data",
sql: sql
}, function (result) {
var data_list = eval("(" + result + ")");
return (data_list.length > 0);
});

2、异步的调用方式的后果:
在被调函数中,我需要用上面代码的返回值来看数据库是否有重复数据。
但由于是异步调用,等post返回时,我的调用函数早就执行完成了,根本等不到被调函数的返回值。所以结果超出了预期。

3、post无法设置同步:
POST方法在Jquery中默认是不支持同步调用的。如果非要使用同步方法,可以设置ajax的全局变量:
$.ajaxSetup({
async : false
});
async为true表示异步,也是默认值。为false时表示同步。

4、修改全局变量的隐患:
按上述方法修改全局变量后,你的整个站点代码都将受到影响。也就是说全部ajax请求都会按照同步的方式来处理。这可能是你不希望看到的。
当然你可以在使用完成后再把全局变量改过来。不过这似乎也不太好。应该还有更好的办法。

5、通过ajax直接调用:
$.ajax({
type : "post",
url : "logic.php",
data : data, // var data = {"type": "query_sql_get_data", "sql": sql};
async : false, // 同步调用
success : function(result){
var data_list = eval("(" + result + ")");
hasError = (data_list.length > 0);
}
});
return hasError; // 注意返回要在这里,不要在成功时的回调函数时,否则调用函数无法得到正确的返回值。

6、难以发现的问题:
类似这种问题,如果没有相关经验时,可能不容易发现。因为在调试单个函数时,你得到的结果都是正确的。甚至你可能怀疑是否浏览器出了问题。
所以有时除了单步跟踪外还应该注意函数的调用栈等一些额外的信息,不断的积累经验。

7、同步异步如何用:
ajax的作用其实是为了解决页面的局部刷新的。所以我们通常使用的都是异步请求。这也是为什么以异步作为默认值的原因。但当我们处理处理逻辑相关的业务时(特别是有先有顺序那种),就要考虑同步的情况了。
