首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Ext JS AJAX 同步請求失效?版本差異與正確處理非同步回呼

     編輯:程式設計綜合問答

問題現象

使用 Ext.Ajax.request({ async: false, ... }) 期望同步阻塞,取得 minValue 後續邏輯卻拿到初始值 0,alert("minValue"+minValue) 顯示 0,顯示同步設定未生效。

核心原因:Ext JS 版本差異

  • Ext JS 4.0 以前:不支援 async: false,所有請求強制非同步,async 設定會被忽略。
  • Ext JS 4.1+:開始支援 async: false,可同步阻塞。
  • Ext JS 5/6/7 (Modern/Classic):支援完整,但**強烈不建議同步**,會凍結瀏覽器主執行緒,導致使用者體驗極差。

正確架構:擁抱非同步 + Promise / 回呼

function queryValue(id, arg) {
    return new Promise((resolve, reject) => {
        Ext.Ajax.request({
            url: '<%=path%>/jsp/C02/C0201/C020101.do',
            params: { operationType: 'doMaxMinValue', dataId: id, testId: Ext.getCmp('testId').getValue() },
            method: 'POST',
            // async: true (預設),不要寫 false
            success: function(response) {
                var obj = Ext.decode(response.responseText);
                if (obj.data && obj.data.list && obj.data.list.length) {
                    var minValue = obj.data.list[0][1];
                    var maxValue = arg; // 或 obj.data.list[1][1]
                    resolve({ minValue, maxValue });
                } else {
                    reject('無有效資料');
                }
            },
            failure: function(response) {
                reject('請求失敗: ' + response.statusText);
            }
        });
    });
}

// 使用範例:async/await (現代瀏覽器) 或 .then()
async function validateAndSubmit() {
    try {
        var { minValue, maxValue } = await queryValue(someId, someArg);
        if (isNaN(minValue) || isNaN(maxValue)) {
            Ext.Msg.alert('錯誤', '類型必須為數字');
            return false;
        }
        if (minValue >= maxValue) {
            Ext.Msg.alert('錯誤', '最大值必須大於最小值');
            return false;
        }
        // 通過驗證,繼續提交表單等
        return true;
    } catch (err) {
        Ext.Msg.alert('異常', err);
        return false;
    }
}

為何不建議同步?

缺點說明
凍結 UI主執行緒阻塞,使用者無法點擊、滾動、甚至關閉瀏覽器標籤
瀏覽器警告Chrome/Firefox 主控台會輸出 Synchronous XMLHttpRequest on the main thread is deprecated
無法取消網路延遲時使用者只能強制關閉頁面
不利擴展後續需串聯多個 API 時,同步寫法會陷入回呼地獄

遷移檢查清單

  1. 確認專案 Ext JS 版本(Ext.getVersion())。
  2. 將所有 async: false 移除,改用 Promise 封裝。
  3. 將後續邏輯移入 success 回呼或 .then() 鏈中。
  4. 全域錯誤處理可用 Ext.Ajax.on('requestexception', ...) 統一攔截。

結語

Ext JS 早期版本根本不支援同步請求,新版雖支援但違反現代 Web 最佳實踐。採用 Promise + async/await 重構非同步流程,既能解決變數賦值時序問題,又能保持 UI 流暢、程式碼可維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved