CHAPTER 24 · PRACTICE WORKSPACE

即時資料模型與 Firebase 介面

完成可追蹤、可取消、可模擬訂閱失敗並重試的 memory adapter 即時留言原型,不冒充 Firebase

03 Checkpoint 2 2/3
  1. 01Starter讀懂作品骨架
  2. 02Checkpoint 1加入第一項能力
  3. 03Checkpoint 2累積第二項能力
  4. 04Solution核對完整結果

TASK STATUS

三項任務目前狀態

TASK-01已完成

訂閱主畫面並留下 adapter trace

修改檔案:script.js

完成後看見:主畫面 subscriber 收到初始 snapshot,trace 顯示 subscribe 與 notify

TASK-02已完成

安全渲染並管理第二 Console subscriber

修改檔案:script.js

完成後看見:留言以純文字渲染,Console subscriber 可訂閱並可 unsubscribe

TASK-03本階段處理

模擬訂閱失敗、復原重試並新增留言

修改檔案:script.js

完成後看見:失敗時保留舊留言且無幽靈 listener,retry 後畫面與 Console subscriber 同時收到新 snapshot

WORKSPACE

本階段實作區

已完成 TASK-02;先核對可見結果,再前往 TASK-03。

FOCUS TASK · TASK-03

現在只處理:模擬訂閱失敗、復原重試並新增留言

修改:script.js

完成後:失敗時保留舊留言且無幽靈 listener,retry 後畫面與 Console subscriber 同時收到新 snapshot

講解時展開:2 個小型比較

retry vs 重複 listener|復原不能加倍

比較:重試前要確認失敗 listener 已清理,否則成功後可能同一份 snapshot 被處理多次。

現在做:在 Solution 先開啟 Console subscriber,記錄 subscriber=2 與目前第一筆留言;按「模擬下次訂閱失敗」後確認 status 含「訂閱失敗」、第一筆留言仍在、subscriber 回到 1;按「重試訂閱」後確認 subscriber=2,再送出「復原後留言」,核對畫面最後一筆、Console snapshot 與 trace 的 notify update。

看預期與證據

預期:失敗後 status 含「訂閱失敗」、第一筆留言仍在、subscriber 回到 1;retry 後 subscriber=2,新增「復原後留言」時畫面、Console 與 trace 各更新一輪。

證據:留下失敗前後、retry 後與新增留言後的 subscriber 數、最後一筆文字、Console snapshot 次數與 trace,證明沒有幽靈 listener 或重複通知。

保留舊留言 vs 清空畫面|失敗時仍要可用

比較:訂閱失敗時保留最後可用資料,retry 成功後再用新 snapshot 更新。

現在做:重跑失敗路線並做四格時間線:失敗前的留言/subscriber、失敗後的 status/舊留言/subscriber、retry 後的 subscriber=2、送出「復原後留言」後的畫面與 Console 通知;確認沒有重複留言或幽靈 listener。

看預期與證據

預期:四格時間線完整:失敗前保留留言/subscriber、失敗後 status 錯誤且留言不清空、retry 後 subscriber=2、送出「復原後留言」後主畫面與 Console 都收到一次更新,沒有重複項目。

證據:用四格時間線記錄 status、舊留言、subscriber 數、最後一筆文字與 Console 通知,證明失敗保留可用資料、retry 後才以新 snapshot 更新。

需要排錯時查看:任務循環(觀察 → 預測 → 實作 → 故障 → 驗收)
  1. A|觀察:先在 Solution 開啟 Console subscriber,並記住目前留言與 trace 的訂閱者數量。
  2. B|預測:按「模擬下次訂閱失敗」,確認舊留言未被清空;再按「重試訂閱」,新增一筆留言並對照畫面、Console 與 trace。
  3. C|實作:在 script.js 的 failNextSubscribe()、startListening() 錯誤分支、retry 事件、addMessage() 完成「模擬訂閱失敗、復原重試並新增留言」,一次只處理本任務責任。
  4. D|故障:若結果不一致,先依原操作重現,再檢查 failNextSubscribe()、startListening() 錯誤分支、retry 事件、addMessage() 與 script.js,最後重跑原操作。
  5. E|驗收:失敗時保留舊留言且無幽靈 listener,retry 後畫面與 Console subscriber 同時收到新 snapshot

完成條件:DONE-03:失敗時保留舊留言且無幽靈 listener,retry 後畫面與 Console subscriber 同時收到新 snapshot

MEMORY ADAPTER(只練介面,不是 Firebase 連線)

可追蹤的即時留言

本頁每次重新整理都會建立獨立記憶體,不會跨分頁同步。

尚未訂閱

訂閱生命週期控制

目前 subscriber:0 個

    Adapter trace

      CONTINUE

      繼續完成 TASK-03

      前往 Solution,依要求完成「模擬訂閱失敗、復原重試並新增留言」。

      前往 Solution:完成 TASK-03

      CHAPTER HANDOFF

      從一次提交,交棒到持續訂閱

      接收第 23 章:沿用已驗證的 payload 與一次提交生命週期;本章不重做表單驗證,改追蹤初始 snapshot、後續 push 與 unsubscribe。

      交給第 25 章:完成後帶著 memory adapter 的 subscriber trace、安全 render、取消訂閱與失敗重試證據;下一章直接加入 uid 與權限判斷,不把 memory adapter 宣稱成 Firebase。

      前往第 25 章:身份、uid 與權限模型