許多初學者認為代碼是「自上而下同步執行」的,但 $.ajax() 默認 async: true(異步),發送請求後立即返回,主線程繼續執行後續代碼;只有當服務器響應到達,瀏覽器才將回調函數(success/done/complete)推入任務隊列,待主線程空閒時執行。
時間 →
主線程: |---發送AJAX---|---執行後續代碼(showDetail)---|---空閒---|---執行回調函數(data處理)---|
網絡IO: |========請求/響應========|
事件循環: |回調入隊|->|回調執行|
$.ajax({ url: '/api/data', success: function(data) {
render(data); // ① 回調內:渲染數據
} });
showDetail(); // ② 主線程:立即執行,但 data 尚未就緒 → 報錯/顯示空
$.ajax({url: '/api/data'})
.done(function(data) { render(data); })
.then(function() { showDetail(); }); // 確保渲染完成後執行
async function loadAndShow() {
const data = await $.ajax({url: '/api/data'});
render(data);
showDetail();
}
$.ajax({ url: '/api/data', async: false, success: ... });
showDetail();
async: true,拒絕同步 AJAX。.done()/.fail()/.always() Promise API,避免傳統 success/error/complete 回調屬性(jQuery 3.0+ 棄用)。理解「發起請求 ≠ 獲得數據」,掌握異步編程模型,是前端進階的分水嶺。