初級 免費 ⏱ 18:00
10-1 正視承諾:Promise 與網路請求
擺脫回調地獄。深入理解 Promise 的三種狀態、鏈式調用,以及如何使用 Fetch API 進行現代網路請求。
10-1 正視承諾:Promise 與網路請求
👋 **老師的話 (Script)**:
"歡迎來到 JavaScript 最具代表性的章節。
早期的 JS 處理異步(像是等檔案讀完、等 API 回傳)是用『回調函數 (Callback)』。
結果就是代碼一直往右邊縮排,變成了可怕的『回調地獄』。
Promise 的出現,是為了讓我們像寫同步程式一樣,優雅地寫異步程式。
它不只是一個技術,它是一種設計哲學:『我現在還沒拿到結果,但我承諾你,拿到後我會通知你。』“
1. 什麼是 Promise?
Promise 有三種狀態:
- Pending (等待中):初始狀態。
- Fulfilled (已實現):作業成功,呼叫
resolve()。 - Rejected (已拒絕):作業失敗,呼叫
reject()。
const myWait = new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
success ? resolve("成功!") : reject("慘,失敗了...");
}, 1000);
});
myWait
.then(res => console.log(res))
.catch(err => console.error(err));
2. 現代網路請求:Fetch API
不要問 AJAX 怎麼寫,在 2026 年,我們只用 fetch。註:fetch 回傳的就是一個 Promise。
fetch("https://api.example.com/data")
.then(response => {
if (!response.ok) throw new Error("網路連線不給力");
return response.json(); // 這裡也回傳 Promise
})
.then(data => console.log(data))
.catch(error => console.error("發生錯誤:", error));
3. Promise 全家桶
Promise.all([p1, p2]): 等「全部」都成功才成功。Promise.race([p1, p2]): 誰「最快」回傳就取誰。Promise.allSettled(): 不管成敗,等全部「處理完」才繼續。
🧪 Lab 22: 同步併發挑戰
同時使用
fetch 請求兩支 API。
必須等到兩份資料都拿到後,才在畫面上印出「全部資料已載入」。