一.同步和異步區別
簡單說:同步是阻塞模式,異步是非阻塞模式。
舉個例子:普通B/S模式(同步)AJAX技術(異步)
同步:提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事
異步: 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢
二.XMLHttpRequest 異步方式和同步方式
xmlHttp.open("GET", url, false);//同步方式請求
xmlHttp.open("GET", url, true)//異步
三.項目舉例
在項目中有時候需要用到XMLHttpRequest,但是什么時候用同步,什么時候用異步,這個有時候差距看不出來,但是有時候錯誤出現了,還不知道什么原因,有時候正確,有時候執行有錯誤了。
以使用XMLHttpRequest來進行上傳文件做測試,我們需要先上傳文件到服務器,然后保存表單信息並保存上傳文件的url。
以下是正確代碼,使用了同步方式。
var fd = new FormData();
fd.append("fileToUpload", top.window.document.getElementById('fileToUpload').files[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", WEB + "/Thesis/ImportPdf",false);//上傳文件到服務器
xhr.send(fd);
xhr.addEventListener("load", uploadComplete(dialog), false); //上傳完畢后,保存表單信息以及上傳文件路徑信息
上面代碼有兩處需要往下執行,分別是:xhr.open("POST", WEB + "/Thesis/ImportPdf",false);和xhr.addEventListener("load", uploadComplete(dialog), false);
如果我們使用xhr.open("POST", WEB + "/Thesis/ImportPdf",true);//異步方式,如果文件小,可能照常本來第二步需要保存路徑信息也能取到,但是文件太大,上傳需要時間。異步的話,第一步上傳文件還沒上傳完畢,第二步就執行了,但最終我們獲取不到上傳文件路徑信息。所以需要使用阻塞式的同步方式。
