iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Software Development

SyncETA 開發日記:手把手打造你的智慧出發時間推薦 PWA系列 第 19 篇

【Day 19】把建議邏輯寫進程式,串接真實資料

  • 分享至 

  • xImage
  •  

昨天的推薦邏輯還是用假資料測試,今天要把它跟系統其他部分真正串起來。


用 TDX 資料模擬「歷史花費時間」

嚴謹來說,「歷史花費時間」應該是長期蒐集使用者實際搭乘紀錄而來,但作為教學示範,我們先用一個簡化做法:多次呼叫 TDX API、記錄同一路線在不同時間點的到站時間,模擬出一組「近期變動範圍」。

// src/api/tdx.js(新增)
export async function collectRecentEtas(city, routeName, samples = 6, intervalMs = 5000) {
  const results = [];
  for (let i = 0; i < samples; i += 1) {
    const raw = await fetchBusArrivals(city, routeName);
    const arrivals = normalizeArrivals(raw);
    if (arrivals[0]?.etaMinutes != null) {
      results.push(arrivals[0].etaMinutes);
    }
    await new Promise((resolve) => setTimeout(resolve, intervalMs));
  }
  return results;
}

這個函式為了教學示範會實際等待一段時間,正式環境建議改成長期背景蒐集並存進資料庫,而不是在使用者查詢當下才即時取樣。

在 main.js 中整合推薦流程

// src/main.js
import { recommendDepartureTime } from './logic/recommend.js';

async function suggestDeparture(arrivalDeadline, confidenceLevel) {
  // 示範用:實務上這裡應該讀取事先蒐集好的歷史資料
  const history = [25, 27, 26, 30, 28, 35, 26, 29, 27, 40];

  const suggestion = recommendDepartureTime(history, confidenceLevel, arrivalDeadline);

  document.getElementById('suggestion').textContent =
    `建議出發時間:${suggestion.departureTime.toLocaleTimeString()}` +
    `(預留緩衝 ${suggestion.bufferMinutes} 分鐘,信心水準 ${confidenceLevel * 100}%)`;

  return suggestion;
}

記得在 index.html 加上顯示區塊:<p id="suggestion"></p>。


為什麼要老實標註「示範用」?

我特別在註解寫「示範用」,是想強調一件事:教學專案的簡化,不代表正式系統可以這樣做 。

如果你未來要把這個概念用在正式產品或研究論文中,歷史資料的蒐集方式、樣本數是否足夠、資料是否有時段差異(例如尖峰離峰不同),都需要更嚴謹的設計。


明天,我們要讓使用者可以自己調整「信心水準」,而不是寫死在程式碼裡。


上一篇
【Day 18】設計一個簡化版的出發時間建議規則
下一篇
【Day 20】讓使用者可以調整「想要多準時」的偏好
系列文
SyncETA 開發日記:手把手打造你的智慧出發時間推薦 PWA 共 23 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言