465 字
2 分钟
精确计时场景的常见方案
一些需要精确计时的场景
NOTE
- 在线游戏
- 金融交易系统
- 多媒体应用
- 工业控制
- 实时监控平台
- … …
常见方案
1. 服务端主导的时间同步
优 势
- 误差可控制在 10-50ms 内
- 避免客户端时间篡改
- 支持多设备同步

简单示例:
// 客户端async function syncTime() { const start = Date.now(); const response = await fetch('/api/sync-time'); const end = Date.now();
const { serverTime } = await response.json(); const networkDelay = (end - start) / 2;
// 校正客户端时间 const correctedTime = serverTime + networkDelay; return correctedTime;}
// 服务端 (Node.js)app.get('/api/sync-time', (req, res) => { res.json({ serverTime: Date.now() });});2.WebSocket 实时时序控制
适 用 场 景
- 多人在线游戏、实时协作工具
服务端示例:
// 服务端广播时序指令const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });
setInterval(() => { const timestamp = Date.now(); wss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(JSON.stringify({ type: 'SYNC_TIMER', payload: timestamp })); } });}, 100); // 每100ms广播一次客户端示例:
const ws = new WebSocket('ws://server-address');ws.onmessage = (event) => { const data = JSON.parse(event.data); if (data.type === 'SYNC_TIMER') { // 执行需要精确时间的操作 renderFrame(data.payload); }};3. Web Workers + 高精度 API
TIP关键API:
- performance.now():微秒级精度(不受系统时间影响)
- performance.timeOrigin:页面加载起始时间点
简单示例:
// 在 Web Worker 中执行精确计时let startTime;self.onmessage = (e) => { if (e.data.command === 'start') { startTime = performance.now(); setInterval(() => { const elapsed = performance.now() - startTime; self.postMessage({ elapsed }); }, e.data.interval); }};
// 主线程const worker = new Worker('timer.worker.js');worker.postMessage({ command: 'start', interval: 10 });worker.onmessage = (e) => { console.log(`精确耗时: ${e.data.elapsed.toFixed(3)}ms`);};总结
1.分层控制策略
| 精度要求 | 解决方案 |
|---|---|
| 1ms+ | Web Workers + performance.now() |
| 10ms+ | 服务端时间同步 |
| 100ms+ | 原生 setTimeout |
2.黄金法则
WARNING
- 关键时间判断必须在服务端执行
- 客户端只做可视化展示
- 所有时间敏感操作附带时间戳
- 使用 ISO 8601 格式传输时间