关于ajax:AJAX同步和异步

42次阅读

共计 1932 个字符,预计需要花费 5 分钟才能阅读完成。

一. 什么是同步申请:(false)

同步申请即是以后发出请求后,浏览器什么都不能做,必须得等到申请实现返回数据之后,才会执行后续的代码,相当于是排队,前一个人办理完本人的事务,下一个人才能接着办。也就是说,当 JS 代码加载到以后 AJAX 的时候会把页面里所有的代码进行加载,页面处于一个假死状态,当这个 AJAX 执行结束后才会持续运行其余代码页面解除假死状态 (即当 ajax 返回数据后,才执行前面的 function2)。

同步:提交申请 -> 期待服务器解决 -> 处理完毕返回 这个期间客户端浏览器不能干任何事异步: 申请通过事件触发 -> 服务器解决(这是浏览器依然能够作其余事件)-> 处理完毕同步须要期待返回后果能力持续,异步不用期待,个别须要监听异步的后果。

二. 什么是异步申请:(true)

异步申请就当发出请求的同时,浏览器能够持续做任何事,Ajax 发送申请并不会影响页面的加载与用户的操作,相当于是在两条线上,各走各的,互不影响。

个别默认值为 true 异步。异步申请能够齐全不影响用户的体验成果,无论申请的工夫长或者短,用户都在分心的操作页面的其余内容,并不会有期待的感觉。

简略来说同步是在一条直线上的队列,异步不在一个队列上各走各的。

Ajax 同步和异步区别?

咱们在应用 ajax 个别都会应用异步解决。

异步解决:咱们通过事件触发到 ajax,申请服务器,在这个期间无论服务器有没有响应,客户端的其余代码一样能够运行。

同步解决:咱们通过实际触发 ajax,申请服务器,在这个期间期待服务器解决申请,在这个期间客户端不能做任何解决。当 ajax 执行结束才会继续执行其余代码。

以 jquery 的 async:false, 这个属性

默认是 true:异步,false:同步。举例:

同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我通知你听到了,才一起去吃饭。

异步就是你叫我,而后本人去吃饭,我失去音讯后可能立刻走,也可能等到忙完才去吃饭。

AJAX 中依据 async 的值不同分为同步(async = false)和异步(async = true)

$.ajax({ 

       type: "post", 

      url: "path", 

      cache:false, 

      async:false, 

       dataType: ($.browser.msie) ? "text" : "xml", 

        success: function(xmlobj){function1(){};} 

});

function2(){}; 

默认状况下 async 是 true
同步和异步有什么不同:

异步: 在异步模式下,当咱们应用 AJAX 发送完申请后,可能还有代码须要执行。这个时候可能因为种种原因导致服务器还没有响应咱们的申请,然而因为咱们采纳了异步执行形式,所有蕴含 AJAX 申请代码的函数中的残余代码将继续执行。如果咱们是将申请后果交由另外一个 JS 函数去解决的,那么,这个时候就好比两条线程同时执行一样。

同步: 在同步模式下,当咱们应用 AJAX 发送完申请后,后续还有代码须要执行,咱们同样将服务器响应交由另一个 JS 函数去解决,然而这时的代码执行状况是:在服务器没有响应或者解决响应后果的 JS 函数还没有解决实现 return 时,蕴含申请代码的函数的残余代码是不可能执行的。就好比单线程一样,申请收回后就进入阻塞状态,晓得接触阻塞余下的代码才会继续执行。

看以下代码:

var flag=true;
var index=0;
$.ajax({
 url: "",
 success: function(data){flag=false;} 
});
while(flag){index++;}
alert(index);

最终程序进入了一个死循环
看以下代码:var flag=true;
$.ajax({
 url: "",
 success: function(data){flag=false;} 
});
alert(flag); 

最终后果是 true

js 是单线程的,因为执行 ajax 申请会耗费肯定的工夫,甚至呈现了网络故障而迟迟得不到返回后果;这时,如果同步执行的话,就必须等到 ajax 返回后果当前能力执行接下来的代码,如果 ajax 申请须要 1 分钟,程序就得等 1 分钟。如果是异步执行的话,在等在 server 端返回的这个过程中,前台会会继续执行 ajax 块前面的脚本,直到 server 端返回失常的后果才会执行 success,这时候执行的是两个线程,ajax 块发出请求后一个线程和 ajax 块前面脚本

var flag=true;
var index=0;
$.ajax({
 url: "",
 async:false,
 success: function(data){flag=false;} 
});
while(flag){index++;}
alert(index); 

最终后果是 0

正文完
 0