最近在上springmvc的JSON數據交換的時候,老師下課提了一個課后問題:什么是異步請求?什么是同步請求?我想大部分同學聽到這個問題的時候應該和我一樣不知所雲。現在,給大家分享一篇關於同步請求和異步請求的小知識。
舉個例子:普通B/S模式(同步)AJAX技術(異步)
同步:提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事
異步: 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢
同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。
異步就是你叫我,然后自己去吃飯,我得到消息后可能立即走,也可能等到下班才去吃飯。
所以,要我請你吃飯就用同步的方法,要請我吃飯就用異步的方法,這樣你可以省錢。
請求方式,分為GET與POST:
GET
最為常見的HTTP請求,普通上網瀏覽頁面就是GET。GET方式的參數請求直接跟在URL后,以問號開始。(JS中用 window.location.search獲得)。參數可以用encodeURIComponent進行編碼,使用方式:
var EnParam = encodeURIComponent(param);
URL只支持大約2K的長度,即2048字符數;使用GET進行AJAX請求時候會緩存導致出現的頁面不是正確的,一般方法加random參數值;ajax.send(null)。
POST
向服務器提交數據用到。
需要將form表單中的值先取出轉換成字符串,用&符號連接,(同GET傳參數一樣);提交數據量2GB;使用ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded'),處理提交的字符串;ajax.send(strings),這個strings表示form中需要提交的內容,例如a=1&b=2類似這樣的字符串。
同步與異步:
舉個例子:普通B/S模式(同步)AJAX技術(異步)
同步:提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事
異步: 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢
ajax.open方法中,第3個參數是設同步或者異步。prototype等js類庫一般都默認為異步,即設為true。先說下同步的情況下,js會等待請求返回,獲取status。不需要onreadystatechange事件處理函數。而異步則需要onreadystatechange事件處理,且值為4再正確處理下面的內容。
//同步傳輸模式
function RequestByGet(nProducttemp,nCountrytemp)
{
var xmlhttp
if (window.XMLHttpRequest)
{
//isIE = false;
xmlhttp = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
//isIE = true;
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//Web page location.
var URL="http://www.baidu.com/;
xmlhttp.open("GET",URL, false);
//xmlhttp.SetRequestHeader("Content-Type","text/html; charset=Shift_JIS")
xmlhttp.send(null);
var result = xmlhttp.status;
//OK
if(result==200)
{
document.getElementById("div_RightBarBody").innerHTML=xmlhttp.responseText;
}
xmlhttp = null;
}
//異步傳輸模式
var xmlhttp
function RequestByGet(nProducttemp,nCountrytemp)
{
if (window.XMLHttpRequest)
{
//isIE = false;
xmlhttp = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
//isIE = true;
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//Web page location.
var URL="http://www.baidu.com/";
xmlhttp.open("GET",URL, true);
xmlhttp.onreadystatechange = handleResponse;
//xmlhttp.SetRequestHeader("Content-Type","text/html; charset=UTF-8")
xmlhttp.send(null);
}
function handleResponse()
{
if(xmlhttp.readyState == 4 && xmlhttp.status==200)
{
document.getElementById("div_RightBarBody").innerHTML=xmlhttp.responseText;
xmlhttp = null;
}
}
同步執行模式:
所謂同步執行模式,是指語句在同步執行模式下,將始終保持對程序流的控制,直至 程序結束。如查詢操作,客戶機上的應用程序在向服務器發出查詢操作的指令后,將 一直等待服務器將查詢結果返回客戶機端,然后才繼續進行下一步操作。
眾所周知,應用程序要從一個大表中刪除所有的記錄將是非常耗時的,如果應用程序采用的是單線程(thread)同步執行方式,某次刪除工作很可能耽誤其他重要工作的完成。如果應用程序等待的是遠程任務,那么遠程服務器失敗或網絡故障或一些無法預 知的情況都可能使應用程序無限期地等下去,這是同步執行最大的缺陷。
但是同步執行模式可以簡化程序編制的復雜性。程序員可以不用過多地了解比較復雜 的ODBC 2.0 API 的使用,而只需使用 ODBC 的同步執行模式或使用數據控制項和數據庫對象變量來編寫應用程序,可以提高開發效率,但程序運行速度比不上異步執行 模式的速度。
異步執行模式:
所謂異步執行模式,是指語句在異步執行模式下,各語句執行結 束的順序與語句執行開始的順序並不一定相同。例如查詢操作,客戶機上的應用程序在向服務器發出了查 詢操作的指令后,將立刻執行查詢語句指令的下一條語句,而不需要等到服務器將查詢結果返回客戶機端。 異步執行方式使應用程序能擺 脫單個任務的牽制,提高了靈活性和應用程序的執行效率。但異步執行模式也存在一些問題,如它增加了 編程的復雜性,特別是編寫互用性(interoperable)要求較高 的程序。
在負荷很重的客戶/服務器系 統中,適宜采用異步執行模式。在這種環境下,時間 延遲頻繁且漫長,相比之下異步執行的開銷微不足道。但是,如果應用運行的環境比較復雜,則必須建 立一套完整的機制,周期性地檢查函數執行的狀態,以決定下一步執行方案。進行周期的檢查可以有多種方法,如在 應用中設置計時器並處理WM_TIMER信息等。
雖然使用異步執行模式在編程 序時十分復雜,但可以實現多任務並行執行,使執行的效率大大提高。
選擇並設置執行模式 在應用程序開發中選擇同步模式還是異步模式,是一個比較復雜的層次。當查詢或對數據庫的修改相對簡單時,同步執行模式是一種 很好的選擇,它能夠在幾秒 或更少的時間內返回結果數據。另外,在應用程序獲得結果集前不能繼續執行時,根本不必要使用異步執 行模式。在復雜查詢情況下,特別是復雜的多行數據 庫的UPDATE 或DELETE操作,可能需要很長的時間才能完成, 需采用異步執行模式,讓用戶可以同時對程序的其他 部分進行操作。
對於一般程序員來說,如果他對同步執行模式與異步執行模式不了解, 他往往會在對服務器發出一個操作語句(查詢或讀取一條記錄等操作)后,立該引用服務器返回的執行結果,或者對該 結果進行下一步操作,這是很危險的。因為,在異步執行模式下,客戶機上的后續語句是在該操作語句發 出后接着執行的,但由於各種原因,服務器不一定能 執行完該操作語句,並在后續語句執行前將結果返回客戶機。因此,后續語句在引用前一操作語句的執行 結果時,往往會因為該執行結果並不存在而引用了錯 誤的值,造成系統錯誤或死鎖,所以在實際應用中應根據具體情況慎重選擇執行模式。
轉自:https://blog.csdn.net/morethinkmoretry/article/details/5791258