今天使用ajax时遇到一个很奇怪的问题,代码如下:
layer.confirm('真的删除行么', function(index){
var flag;
//向服务端发送删除指令
$.get("delBlogType",{
id : data.id
},function(data1,textStatus){
//textStatus假如不是success,不执行回调函数,但是我的后台捕捉了异常,
//所以一定会成功执行这回调函数,故通过后台返回的Msg是否删除成功
flag = data1.msg;
},"json");
if(flag === '200'){
layer.msg("删除成功");
obj.del(); //删除对应行(tr)的DOM结构,并更新缓存
layer.close(index);
}else{
layer.msg("删除失败,该分类下可能有文章");
layer.close(index);
}
});
可以看出来,flag变量可以理解为一个全局的变量,刚开始它是没有赋初值的,后来我使用了jquery的ajax调用,在回调函数中将获取到的数据赋给flag变量,然后在后面的过程中根据flag值的不同,执行不同的代码
然后问题就出现了,不管我获取到的值是不是“200”,flag===“200”一定返回的false
于是我就将flag的值打印出来,发现不管我怎么获取,flag的值永远是空的,也就是未定义的意思,难怪判断永远返回false
经过一番查找后我找到了原因,其实这就是要好好的理解异步调用。
对于异步调用而言,可以理解成是另外的一个线程,于是在我的代码中,只要异步调用一发出,就会继续往下执行代码,而不会管回调函数进行与否。所以,情况是我的回调函数还没开始执行(flag还未赋值),程序已经走到了flag===“200”这一句,故永远返回false
为了满足我的需求,我这么修改(就是将判断放到回调函数中)
layer.confirm('真的删除行么', function(index){
var flag;
//向服务端发送删除指令
$.get("delBlogType",{
id : data.id
},function(data1,textStatus){
//textStatus假如不是success,不执行回调函数,但是我的后台捕捉了异常,
//所以一定会成功执行这回调函数,故通过后台返回的Msg是否删除成功
flag = data1.msg;
if(flag === '200'){
layer.msg("删除成功");
obj.del(); //删除对应行(tr)的DOM结构,并更新缓存
layer.close(index);
}else{
layer.msg("删除失败,该分类下可能有文章");
layer.close(index);
}
},"json");
});
问题就解决了,特此记录