1.情景展示
我們使用ajax請求,大部分情況下,使用異步請求,也就是上下代碼的執行互不影響,可以同時執行,可以節省時間;
但是,經常會出現只能使用同步請求的需求,也就是代碼需要一行一行執行,上面的代碼執行完畢並得到服務器響應結果后,下面的代碼才允許執行,更為簡單的理解就是:
下面的代碼,必須拿到上面請求的結果,並根據返回結果做進一步處理。
也許,你會說:直接將請求結束需要執行的代碼扔到返回處理的回調函數里面,不就行了?也許可以,如果你這樣想,就是你還未真正理解什么叫做:同步請求。
舉個實際使用場景案例:
需求:當點擊“新增”時,需要去后台校驗,如果能夠匹配到數據,就彈出無法添加的錯誤提醒窗口①;
當后台校驗沒有匹配到數據,才彈出新增窗口②;
而現在,顯然不符合新增的要求,但是,后面的新增窗口②還是彈出來了,這個時候,我們就可以使用同步請求來解決這個問題。
2.源碼展示
this.add = function add() {
// Step1:父級主題狀態校驗
var PARENTSTATUS = $('#PARENTSTATUS').val() || 1;
if (PARENTSTATUS == 2) {//2:注銷
Dialog.Alert("消息提示", "該主題已是注銷狀態,不允許再增加主題!");
return;
}
// Step2:主題與表關聯校驗
var isTrue = true;
// 第一級肯定是主題
var PARENTTHEMEID = $('#PARENTTHEMEID').val();
if (PARENTTHEMEID != 0) {
// 查詢該主題是否已經和表進行了關聯
$.ajax({
url : baseUrl + "/metadata/metaTheme/haveTable.do",
data: {THEMEID:PARENTTHEMEID},
//cache : false,// 禁止瀏覽器緩存請求
//async : false,// 必須使用同步請求
type : "POST",// 請求方式
//dataType : 'json',// 指定返回數據的格式,ajax會根據返回數據自動匹配數據格式
success : function (result){
// 說明模塊已經和表關聯
if (result.count > 0) {
Dialog.Alert("消息提示", "該主題已和表進行關聯,不允許再增加主題!");
isTrue = false;
} else {
isTrue = true;
}
}, error :function (){}// ajax請求異常處理
});
}
// Step3:新增主題
// 從第二級菜單開始,可能是主題,也可能是表
if (PARENTTHEMEID == 0 || isTrue) {
// 彈出新主題塊窗口
var PARENTTHEMEID = document.getElementById("PARENTTHEMEID").value;
var param = "PARENTTHEMEID=" + PARENTTHEMEID;
var dialog = window.openDialog("AddMetaThemeDialog", baseUrl + "/metadata/metaTheme/viewAdd.do?" + param, "新增", null, null, 600, 200);
dialog.Refresh = function(Id) {
tree.SelectNode.Refresh();
object.search();
};
}
};
說明:當PARENTHEMEID=0或者當前主題沒有與表進行關聯時,才允許新增主題;
但目前由於使用的是異步請求,導致並沒有限制住,具體效果就是首圖那樣。
3.具體實現
方式一
$.ajaxSettings.async = false;
方式二
$.ajaxSetup({
async : false
});
方式三
$.ajax({})添加屬性:async : false
$.ajax({
async : false
});
需要說明的是:async屬性必須和ajax共同使用,也就是給ajax增加使用,如下圖所示:
上圖才是正常使用方式,下圖使用方式無效!!!
小結
方式一和方式二:必須在ajax請求前增加,否則不對當前請求生效,可以和$.ajax()、$.post()、$.get()、$.getJSON()結合使用;
方式三:必須和$.ajax()結合使用,不能與$.post()、$.get()、$.getJSON()使用;
方式四
使用同步請求,其實是違背了ajax請求的初衷,它的特點就在於異步請求,現在改成了同步請求,和普通請求,沒有兩樣;
所以,我們就可以使用原生的XmlHttpRequest發送請求;
// 創建XmlHttpRequest請求對象
const xhr = new XMLHttpRequest();
// 設置請求地址
const url = baseUrl + "/metadata/metaTheme/haveTable.do";
xhr.open('post', url, false); // 同步請求,true:異步請求
// 指定請求內容類型
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// 配置請求參數(上面是form表單內容類型的話,下面參數格式要用key=value&...)
const params = 'THEMEID=' + PARENTTHEMEID;
// 發送請求
xhr.send(params);
// 以json格式解析返回數據
const result = JSON.parse(xhr.responseText);
// TODO 接下來對返回數據進行處理
4.效果展示
寫在最后
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!