$.ajax 默認 async: true(異步)。若觀察到「同步阻塞」現象,必是代碼邏輯或判斷方式有誤。
// 發起請求
$.ajax({
url: '/api/data',
success: function(res) {
console.log('2. 請求完成,執行回調', res);
}
});
console.log('1. 發起請求後立即執行,不等待響應');
// 輸出順序:
// 1. 發起請求後立即執行,不等待響應
// 2. 請求完成,執行回調 {data: ...}
function fetchData() {
return $.ajax({ url: '/api' }); // 返回 Promise
}
fetchData().done(function(res) {
console.log('回調執行');
});
console.log('外層代碼'); // 先輸出「外層代碼」→ 異步!
若在 .done() 內部執行耗時操作導致界面卡頓,以為是同步阻塞,實際是 JS 單線程事件循環被佔用。
// 強烈不推薦!會阻塞主線程,導致頁面無響應
$.ajax({ url: '/api', async: false, success: ... });
現代瀏覽器控制台會報警告:Synchronous XMLHttpRequest on the main thread is deprecated...
console.time('ajax');
$.ajax({
url: '/api',
success: function() { console.timeEnd('ajax'); }
});
console.time('sync');
console.timeEnd('sync'); // 先輸出 sync: 0.xxxms
// 稍後輸出 ajax: 200.xxxms (含網絡耗時)
// jQuery 3.0+ 返回 Promise,可直接 await
async function loadData() {
try {
const res = await $.ajax({ url: '/api/data' });
console.log('異步等待,代碼如同步寫法', res);
} catch (err) {
console.error(err);
}
}
async → 默認 true(異步)。async/await 或 Promise 管理異步流程,避免手動判斷同步/異步。