ajax 設置同步請求的4種實現方式


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.效果展示

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM