javascript Ajax 同步請(qǐng)求與異步請(qǐng)求的問題
Posted on 2012-04-15 16:37 zljpp 閱讀(1543) 評(píng)論(1) 編輯 收藏先來看以下代碼:
var flag=true; var index=0; $.ajax({ url: "http://www.baidu.com/", success: function(data){ flag=false; } }); while(flag){ index++; } alert(index);
?請(qǐng)問最后alert的index的結(jié)果是多少?
可能有人會(huì)說0唄。實(shí)際上卻沒那么簡單。大家可以自己試試看。可以看到最終程序進(jìn)入了一個(gè)死循環(huán)!怎么會(huì)這樣呢!
我們?cè)诳匆欢未a:
var flag=true; $.ajax({ url: "http://www.baidu.com/", success: function(data){ flag=false; } }); alert(flag);
?
大家看最后alert出flag的值是多少呢?沒錯(cuò),是true!為什么呢?明明我們?cè)赼jax請(qǐng)求成功了將flag設(shè)為false,怎么還是true呢?
這實(shí)際上是Ajax的異步機(jī)制造成的。
這里解釋一下,同步和異步。js是單線程的,由于執(zhí)行ajax請(qǐng)求會(huì)消耗一定的時(shí)間,甚至出現(xiàn)了網(wǎng)絡(luò)故障而遲遲得不到返回結(jié)果;這時(shí),如果同步執(zhí)行的話,就必須等到ajax返回結(jié)果以后才能執(zhí)行接下來的代碼,如果ajax請(qǐng)求需要1分鐘,程序就得等1分鐘。如果是異步執(zhí)行的話,就是告訴ajax代碼“老兄,既然你遲遲不返回結(jié)果,我先不等你了,我還有一大堆代碼要執(zhí)行,等你執(zhí)行完了給我說一下”。
Ajax默認(rèn)是異步請(qǐng)求的,所以就出現(xiàn)了上面我們看到的結(jié)果。也就是ajax里面的代碼還沒有執(zhí)行完,先執(zhí)行了下面的代碼。
?
那么如何使Ajax執(zhí)行同步請(qǐng)求呢?這就需要設(shè)置async。代碼如下:
var flag=true; var index=0; $.ajax({ url: "http://www.baidu.com/", async:false, success: function(data){ flag=false; } }); while(flag){ index++; } alert(index);
?async默認(rèn)是true,也就是異步,我們?cè)O(shè)置為false,即為同步。這時(shí)我們?cè)倏纯唇Y(jié)果吧。
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦