使用 $.post 或 $.get 時,回調函數中的 data 參數只能在回調內部使用,外部變量無法直接獲取異步請求的結果。
var ajaxData = [];
$.post("/api/data", {param: 1}, function(data) {
ajaxData.push(data.test); // 這裡能訪問 data
});
console.log(ajaxData); // 這裡執行時請求尚未完成,ajaxData 仍為空!
$.post("/api/data", {param: 1}, function(data) {
// 在回調內部直接使用數據
renderUI(data);
updateState(data);
// 或觸發自定義事件
$(document).trigger("dataLoaded", data);
});
function fetchData() {
return $.post("/api/data", {param: 1}); // 返回 Promise-like 對象
}
// 使用
fetchData().done(function(data) {
console.log(data); // 這裡拿到數據
}).fail(function(xhr) {
console.error("請求失敗", xhr);
});
// 或 async/await(需 jQuery 3.0+)
async function loadData() {
try {
const data = await $.post("/api/data", {param: 1});
console.log(data);
} catch (err) {
console.error(err);
}
}
// 會阻塞主線程,導致頁面卡死,已棄用
$.ajax({
url: "/api/data",
async: false, // 同步模式
success: function(data) { ajaxData = data; }
});
.fail() 或 catchxhr.abort() 防止內存洩漏