Ajax中什么时候用同步,什么时候用异步?
AJAX中根據(jù)async的值不同分為同步(async = false)和異步(async = true)兩種執(zhí)行方式;在W3C的教程中推薦使用異步執(zhí)行;
$.ajax({?
??????? type: "post",?
?????? url: "path",?
?????? cache:false,?
???????async:false,?
??????? dataType: ($.browser.msie) ? "text" : "xml",?
???????? success: function(xmlobj){?
? ? ? ? ? ? ? ? ? ? ? function1(){};
??????? }?
});
?function2(){};
默認(rèn)情況下async是true
一.什么是同步請求:(false)
? ?? ? 同步請求即是當(dāng)前發(fā)出請求后,瀏覽器什么都不能做,必須得等到請求完成返回數(shù)據(jù)之后,才會執(zhí)行后續(xù)的代碼,相當(dāng)于是排隊,前一個人辦理完自己的事務(wù),下一個人才能接著辦。也就是說,當(dāng)JS代碼加載到當(dāng)前AJAX的時候會把頁面里所有的代碼停止加載,頁面處于一個假死狀態(tài),當(dāng)這個AJAX執(zhí)行完畢后才會繼續(xù)運(yùn)行其他代碼頁面解除假死狀態(tài)(即當(dāng)ajax返回數(shù)據(jù)后,才執(zhí)行后面的function2)。?二.什么是異步請求:(true)
? ?? ? 異步請求就當(dāng)發(fā)出請求的同時,瀏覽器可以繼續(xù)做任何事,Ajax發(fā)送請求并不會影響頁面的加載與用戶的操作,相當(dāng)于是在兩條線上,各走各的,互不影響。
一般默認(rèn)值為true,異步。異步請求可以完全不影響用戶的體驗效果,無論請求的時間長或者短,用戶都在專心的操作頁面的其他內(nèi)容,并不會有等待的感覺。
下面來區(qū)別一下同步和異步有什么不同:
異步:在異步模式下,當(dāng)我們使用AJAX發(fā)送完請求后,可能還有代碼需要執(zhí)行。這個時候可能由于種種原因?qū)е路?wù)器還沒有響應(yīng)我們的請求,但是因為我們采用了異步執(zhí)行方式,所有包含AJAX請求代碼的函數(shù)中的剩余代碼將繼續(xù)執(zhí)行。如果我們是將請求結(jié)果交由另外一個JS函數(shù)去處理的,那么,這個時候就好比兩條線程同時執(zhí)行一樣。
同步:在同步模式下,當(dāng)我們使用AJAX發(fā)送完請求后,后續(xù)還有代碼需要執(zhí)行,我們同樣將服務(wù)器響應(yīng)交由另一個JS函數(shù)去處理,但是這時的代碼執(zhí)行情況是:在服務(wù)器沒有響應(yīng)或者處理響應(yīng)結(jié)果的JS函數(shù)還沒有處理完成return時,包含請求代碼的函數(shù)的剩余代碼是不能夠執(zhí)行的。就好比單線程一樣,請求發(fā)出后就進(jìn)入阻塞狀態(tài),知道接觸阻塞余下的代碼才會繼續(xù)執(zhí)行。
?那么,同步適用于一些什么情況呢?
? ?? ? 我們可以想一下,同步是一步一步來操作,等待請求返回的數(shù)據(jù),再執(zhí)行下一步,那么一定會有一些情況,只有這一步執(zhí)行完,拿到數(shù)據(jù),通過獲取到這一步的數(shù)據(jù)來執(zhí)行下一步的操作。這是異步?jīng)]有辦法實現(xiàn)的,因此同步的存在一定有他存在的道理。
如何選擇同步還是異步模式?要回答這一問題,我們可以通過下面可能出現(xiàn)的問題來回答:
我們在發(fā)送AJAX請求后,還需要繼續(xù)處理服務(wù)器的響應(yīng)結(jié)果,如果這時我們使用異步請求模式同時未將結(jié)果的處理交由另一個JS函數(shù)進(jìn)行處理。這時就有可能發(fā)生這種情況:異步請求的響應(yīng)還沒有到達(dá),函數(shù)已經(jīng)執(zhí)行完了return語句了,這時將導(dǎo)致return的結(jié)果為空字符串。
總結(jié)
以上是生活随笔為你收集整理的Ajax中什么时候用同步,什么时候用异步?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL count(1) count
- 下一篇: 一致性 Hash 算法学习(分布式或均衡