昨天的推薦邏輯還是用假資料測試,今天要把它跟系統其他部分真正串起來。
嚴謹來說,「歷史花費時間」應該是長期蒐集使用者實際搭乘紀錄而來,但作為教學示範,我們先用一個簡化做法:多次呼叫 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;
}
這個函式為了教學示範會實際等待一段時間,正式環境建議改成長期背景蒐集並存進資料庫,而不是在使用者查詢當下才即時取樣。
// 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>。
我特別在註解寫「示範用」,是想強調一件事:教學專案的簡化,不代表正式系統可以這樣做 。
如果你未來要把這個概念用在正式產品或研究論文中,歷史資料的蒐集方式、樣本數是否足夠、資料是否有時段差異(例如尖峰離峰不同),都需要更嚴謹的設計。
明天,我們要讓使用者可以自己調整「信心水準」,而不是寫死在程式碼裡。