js中全局变量和异步(ajax)调用一起使用会遇到的问题

今天使用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");
                    });
问题就解决了,特此记录

猜你喜欢

转载自blog.csdn.net/qiuwenjie123/article/details/80785200