使用 Ext.Ajax.request({ async: false, ... }) 期望同步阻塞,取得 minValue 後續邏輯卻拿到初始值 0,alert("minValue"+minValue) 顯示 0,顯示同步設定未生效。
async: false,所有請求強制非同步,async 設定會被忽略。async: false,可同步阻塞。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 時,同步寫法會陷入回呼地獄 |
Ext.getVersion())。async: false 移除,改用 Promise 封裝。success 回呼或 .then() 鏈中。Ext.Ajax.on('requestexception', ...) 統一攔截。Ext JS 早期版本根本不支援同步請求,新版雖支援但違反現代 Web 最佳實踐。採用 Promise + async/await 重構非同步流程,既能解決變數賦值時序問題,又能保持 UI 流暢、程式碼可維護。