讓等待看得見
按下按鈕後立即顯示 loading,不讓使用者面對沉默畫面。
CHAPTER 20 · 180 MINUTES
Fetch 像叫外送:送出訂單、等待回應、拆開 JSON;店家休息或地址錯誤時,畫面也要清楚交代。
LEARNING GOALS
按下按鈕後立即顯示 loading,不讓使用者面對沉默畫面。
使用 fetch、response.ok 與 json() 接住回應。
成功顯示卡片,失敗顯示可理解訊息,不讓畫面卡在讀取中。
可觀察目標:按下載入後立即顯示讀取中;成功取得兩筆遠端格式資料;loading、success、empty、error 四態均可控重現,外來文字不會被當成 HTML。
輸入:第 19 章產物:能讀懂既有 jQuery FAQ,再將同一段行為遷移成原生 JavaScript,並維持單開、收合與 aria-expanded
本章輸出:能顯示遠端資料及 loading、success、empty、error 四態
產物類型:mainline;後續用途:第 21 章、第 22 章
PROBLEM & ANALOGY
第 19 章的 FAQ 資料已經放在頁面裡;本章把資料來源移到頁面外。request 是下單、endpoint 是店家地址、response 是送回來的袋子、JSON 是約定好的裝箱格式。
本章要解決:請求需要時間,而且 HTTP 404 也可能收到 response;不能只寫成功路線。
合回共同作品:完成的四態資料載入器會交給第 21 章 GAS 與第 22 章產品列表使用。
SCOPE
request、response、JSON、async/await、try/catch 與 loading/success/empty/error 四態。
HTTP status、Promise 與 CORS;知道它們影響請求,不展開內部機制。
認證 token、OAuth、事件迴圈內部與複雜重試演算法。
CORE IDEAS
response.ok,再解析 JSON。requestItems() 負責請求;loadItems() 負責流程與畫面,不把責任擠成一行。DEBUGGING
課堂刻意錯誤:把 endpoint 改成不存在的路徑製造 404;再讓回應是物件、render 卻期待陣列,觀察不同層的證據。
response.ok,再看解析後的資料型別與欄位。先查:檢查請求開始前是否先 render loading。
先查:在 Network 看實際回應是不是 JSON,不要只看 status 200。
先查:確認錯誤分支寫入訊息並能再次嘗試。
PRACTICE CONTRACT
檔案:script.js
位置:setStatus()
結果:按下載入後立即顯示讀取中
檔案:script.js
位置:requestItems()
結果:成功取得兩筆遠端格式資料
檔案:script.js
位置:createItemCard()、renderItems()、loadItems()
結果:loading 立即出現,成功安全顯示卡片,空資料與失敗各有明確訊息
EVIDENCE
請求開始先顯示 ______;response 由 ______ 解析;資料交給 ______;失敗時顯示 ______。
不要用成功假畫面掩蓋失敗;截圖要標明資料來源是 mock 還是實際 API。
提交成功與失敗畫面各一張,並在 Network 截圖標出 URL 與 status;口述「request → response → JSON → render」順序。
下一章:用 GAS 把試算表變成自己的資料出口,同時保留 mock 備援。