這是一個常見的問題,也是一個容易搞混的問題。這裏先說明我個人判斷同步請求還是異步請求的依據:所調用的請求(某個url),阻塞了後續代碼的執行則爲同步,反之則爲異步。
同步與異步的概念:
同步、異步常常用來描述一次方法調用過程。
同步:方法一旦調用,調用者必須等待方法的返回結果後才能進行後續的操作。
異步:調用者不必等待方法的返回結果,也能進行後續的操作。而,異步方法通常會在另外一個線程中,“真實”地執行着。整個過程,不會阻礙調用者的工作。
幾種常見情況的說明:
1.html中的a標籤與ajax 請求
a. <a href='url'>xx</a> 這種寫法產生的網絡請求可以認爲是異步的,但是沒意義,因爲a標籤是個請求鏈接,點擊之後網頁跳轉。測試 window.location.href='url'(a標籤的js 實現),結果是異步的。
// 按標籤同步
function a_tb(){
tips.val("a標籤同步測試");
window.location.href="ht";
alert("看不出來同步的效果,調用者也沒有阻塞");//姑且認爲是一種 異步
tips.val(tips.val()+" \n測試結束");
}
b.ajax 請求既可以同步也可以異步,關鍵在於async 參數的配置--true 異步,false 同步。
// ajax 默認異步方法調用
function ajax_tb(){
tips.val("ajax 同步測試");
$.ajax({
"url":"ht",
//"type":"GET",
"type":"POST",
"success":function(text){
tips.val(tips.val()+"\n調用返回結果:"+text);
},
"error":function(text){
},
"async":false//設置同步請求
});
tips.val(tips.val()+"\najax同步測試結束");
}
執行結果:
2.還有不同程序語言實現的http請求,要更具實際情況來判斷是同步還是異步。
2.1 java http 異步請求庫:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.1.1</version>
</dependency>