今天部署开发任务的时候,我接到的活中有一个修改bug的活(哈哈,水平不够bug来凑),这个bug是这样式的,点击修改,下拉框动态加载数据有时可以加载到有时又不能获取到。这个是不是很神奇啊。刚开始拿到这个任务的时候,我就考虑到了加载顺序的问题。果不其然啊,我一看js代码,我的乖乖,通篇全用的$.post,部分代码如下:
$.post(url, Obj, function(result){
var dataObj=eval("("+result+")");//为啥要写这句代码,后面说
.................//后面就不写了
我修改之后的代码如下:
function getA(){
var Obj = {
className:'这个就自己看自己的喽',
methodName:'同上',
};
$.ajax({
url: url,
data:Obj,
type:'post',
dataType:'json',
async:false,//下方有解释
success:function(result) {
var dataObj= result;
*******//下面就不写了
上述代码的*async:false;*解释如下:
在ajax中,async来控制异步或同步,默认为true,表示为异步请求,在具体执行过程的表现为,在这个Ajax代码运行的过程中其它代码同样可以运行,那么这里就可能出现一个问题,在ajax请求执行中,可能ajax还未执行完,就可能已经完成了ajax请求后面的操作。(这也是我这个bug出现的原因)。但是当设置为false时,表现的为同步请求,同步请求的意思就是当js代码执行到当前ajax时,会停止页面中的所有代码,当Ajax请求执行完毕后,才继续执行。
而$.post默认就是为异步请求,所以会出现很多很多这样的问题,数据还没加载出来呢,你就完事了。就像结婚新娘还没接到家呢,你婚礼就完事了。那是不是就感觉肯定缺少点啥。
总结:因此我的修改bug的重任就在这同步和异步的恍惚之间解决了。
差点忘了:
var dataObj=eval("("+result+")");//为啥要写这句代码,现在说
解释:如果jquery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,就是将该字符串放于eval()中执行一次。这种方式也适合以普通javascipt方式获取json对象。