本文同步分享於個人部落格:Liwen Chiou | Digital Architect & Full-Stack Engineer
孩子,在踏上今日的領地前,先坐下來喝杯酒吧。
修煉的路很長,別急著奔跑,先聽聽這份卷軸裡的古老叮嚀。我在每一站的盡頭都為你鋪設了 「
實戰演武場 CodePen」。那不只是程式碼的拼湊,而是你在這場暴風雨中,試圖用邏輯點燃的一顆星火。
成功突圍後,別忘了帶著你的戰利品回到 「QuestBoard 佈告欄」。在那裡,你會發現自己從不孤單,公會的夥伴們都正舉杯等待你的歸來。記住...
「 導師看重的從來不是你的劍法有多華麗,而是當你被邏輯擊潰、滿身泥濘後,依然選擇握緊理性的劍柄,再次向真相發起衝鋒的勇氣。 」
「導師,Day 19 告訴我 JS 不會等待耗時任務。但如果我真的需要那份資料才能繼續下一步怎麼辦?難道我只能在每個函式裡面套另一個函式,像洋蔥一樣越寫越深嗎?」
我從懷中掏出一張鑲著金邊的 「預約券 (Promise)」,遞給了眼前疲憊的小冒險者。
「孩子,這就是解決之道。當你委託矮人打造傳奇寶劍(發送非同步請求)時,他不會讓你站在門口乾等。他會給你一張券,這張券代表了一個『承諾』。你可以拿著它去處理別的事,而這張券會隨時追蹤進度,告訴你任務是成功了,還是炸爐了。」
今天,我們要學習如何簽下這份 「時空契約」。
Promise 是一個對「未來某個時間點會完成」的任務的封裝。它就像一個有顏色的狀態燈:
當你手裡握著 Promise,你不再需要在那邊寫回呼函式 (Callback),而是使用更優雅的連動語法:
.then():當案子成功時,我要做什麼?.catch():當案子失敗時,我要怎麼反應?🏹 導師的辨析圖:回呼地獄 vs. Promise 鏈
| 特性 | 傳統回呼 (Callback) | 現代 Promise |
|---|---|---|
| 視覺結構 | 向右無限延伸 (洋蔥) | 向下優雅排列 (鏈條) |
| 錯誤處理 | 每一層都要手動寫 | 一個 .catch 捕捉全局 |
| 閱讀感受 | 看到頭暈 | 清晰如詩 |
導師的圖解心法: 想像你把材料交給矮人後,他吐出一顆發光的球(Promise)。這顆球最初是灰色的(Pending)。一段時間後,如果球變綠了,它會自動呼叫你的
.then()邏輯;如果球變紅了,它會自動跳到你的.catch()區塊。

doTaskA((resultA) => {
doTaskB(resultA, (resultB) => {
doTaskC(resultB, (resultC) => {
console.log("終於完成:" + resultC);
});
});
});
.then 的優雅連動)doTaskA()
.then((resultA) => doTaskB(resultA))
.then((resultB) => doTaskC(resultB))
.then((resultC) => console.log("成就達成:" + resultC))
.catch((err) => console.log("任務失敗:" + err));
孩子,導師當年剛學會
.then時,最常忘記寫return。如果你在
.then裡面呼叫了另一個非同步任務卻沒把結果return出去,下一個.then就會接到undefined。這就像是你在櫃檯領了第一張券,結果去下一站時把券弄丟了。記住:鏈式調用的靈魂在於「持續傳遞」。
恭喜你,冒險者。從 Day 15 到 Day 20,你已經掌握了:
這是一個巨大的的分水嶺。下一個賽段,我們將開啟 Phase 4:與外部世界的連結,在那裡,你將學會如何與真正的伺服器對話。
.then 失敗了,後面的 .then 還會跑嗎?(試著用 .catch 去抓看看!)