jQueryAjax同步异步

   今天在项目开发过程中,要实现这么一个功能

<!-- 当我点击就业的时候,触发onclick时间,check()方法里通过ajax请求返回数据,
  如果该用户已经毕业可以跳转到job.html如果没有毕业不能跳转页面同时弹框提示 -->
       <a href="job.html"  onclick="return check()">就业</a>

我们都知道onclick是优先执行于href属性的,只有onclick返回true才会执行href。接下来看js怎么写的

 function check(){
        var fal=false;
        $.post("URL", function(date){
            if(date==null || date==""){
                fal=true;
                return fal;//其实这个return也只是返回ajax中function的返回值。而不是check()的返回值
            }else{
                alert("请先毕业才能就业")
            }
        })
        
        return fal;
        /*最终发现如果该用户已经毕业,a标签没有任何反应,
        如果还没有毕业,会提示:请先毕业才能就业。界面也是没有反应*/
}

这就很纳闷了,明明返回数据是空,fal变成了ture,怎么最终返回还是false。这就是同步和异步的区别了。

首先,ajax默认情况下是异步的,那什么是异步呢

async默认的设置值为true,这种情况为异步方式,就是说当ajax发送请求后,在等待server端返回的这个过程中,前台会继续 执行ajax块后面的脚本,直到server端返回正确的结果才会去执行success,也就是说这时候执行的是两个线程,ajax块发出请求后一个线程 和ajax块后面的脚本(另一个线程)

js举例:

    $(function() {  
            $.ajax({  
                type : \'post\',  
                async : true,  
                url : \'\',  
                cache : false,  
                data : {},  
                success : function(data){  
                    alert("1111");  
                }  
            });  
            alert("22222");  
        });  
        /*在这里方法中,因为它是异步的,所以它在通过ajax向后端交互的同时,它还会向下执行js代码,就相当于有两个线程
        所以这里是会先弹出"2222",才会弹出"1111",到这个时候,才知道为什么上面js为什么总是返回false,因为异步的时候
        它先执行了下面的return fal,就已经返回flase了*/

所以我们只要把async的属性值改为false就变成同步了

$.post没有这个同步异步设置 ,如果一定要设置异步,只能在执行$.post之前加$.ajaxSettings.async = false; (同步执 
行) 

所以把最上面js改成同步,就可以实现相关功能了

    function check(){
        var fal=false;
         $.ajax({  
                type: "POST",  
                url: "url",  
                async:false,  //同步方式   
                success: function(re){  
                    if(re==null||re==""){
                        fal=true;        
                    }else{
                        alert("请先毕业才能就业");    
                  } 
                } 
            }); 
         return fal; 
    }

 

同步和异步的区别                                         

简单理解:同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。 
而异步则这个AJAX代码运行中的时候其他代码一样可以运行。 

异步:在异步模式下,当我们使用AJAX发送完请求后,可能还有代码需要执行。这个时候可能由于种种原因导致服务器还没有响应我们的请求,但是因为我们采用了异步执行方式,所有包含AJAX请求代码的函数中的剩余代码将继续执行。如果我们是将请求结果交由另外一个JS函数去处理的,那么,这个时候就好比两条线程同时执行一样。

同步在同步模式下,当我们使用AJAX发送完请求后,后续还有代码需要执行,我们同样将服务器响应交由另一个JS函数去处理,但是这时的代码执行情况是:在服务器没有响应或者处理响应结果的JS函数还没有处理完成return时,包含请求代码的函数的剩余代码是不能够执行的。就好比单线程一样,请求发出后就进入阻塞状态,知道接触阻塞余下的代码才会继续执行。

 

 

如果哪里理解不到位,或者理解错了,欢迎指点。

想的太多,做的太少,中间的落差就是烦恼,要么去做,要么别想 少尉【17】