柯里化用于WebSocket心跳包的核心目标是复用固定参数(如类型、来源)并动态注入变化字段(如时间戳、序列号),提升发送简洁性、安全性和可维护性。

在 WebSocket 心跳包中使用函数柯里化,核心目标是:**复用固定参数(如心跳类型、固定字段),动态注入变化部分(如时间戳、序列号)**,让每次发送心跳更简洁、安全、不易出错。
为什么用柯里化处理心跳数据?
WebSocket 心跳通常需满足几个条件:格式统一、字段不可缺、部分字段每次不同(如 timestamp)、避免重复拼接对象。直接写 send({ type: 'ping', ts: Date.now(), seq: ++seqId }) 容易漏字段、难维护。柯里化可提前“锁定”不变结构,只暴露需变的参数接口。
定义固定心跳模板并柯里化
假设服务端要求心跳必须是:{ type: 'heartbeat', from: 'web-client', ts: number, seq: number }。可用柯里化封装:
// 柯里化生成心跳消息函数
const createHeartbeat = (from) => (seq) => ({
type: 'heartbeat',
from,
ts: Date.now(),
seq
});
使用时只需绑定客户端标识,再按需传序列号:
立即学习“Java免费学习笔记(深入)”;
const sendHeartbeat = createHeartbeat('web-client');ws.send(JSON.stringify(sendHeartbeat(1))); // {type:'heartbeat',from:'web-client',ts:171...,seq:1}ws.send(JSON.stringify(sendHeartbeat(2))); // seq 变,其余自动填充
结合定时器自动发送(带自增序号)
实际心跳需定时触发,且序号递增。可将柯里化与闭包结合管理状态:
const heartbeatSender = (ws, from) => {
let seq = 0;
const make = () => ({
type: 'heartbeat',
from,
ts: Date.now(),
seq: ++seq
});
return () => ws.readyState === WebSocket.OPEN && ws.send(JSON.stringify(make()));
};
// 使用
const send = heartbeatSender(ws, 'admin-panel');
setInterval(send, 30000); // 每30秒发一次,自动带新seq和ts
扩展:支持可选字段或环境适配
若不同环境需加不同字段(如 dev 加 debug: true),可用多层柯里化或配置对象:
const createHeartbeat = (base) => (opts = {}) => ({
...base,
ts: Date.now(),
...opts
});
const prodHeartbeat = createHeartbeat({ type: 'heartbeat', from: 'prod-app' });
const devHeartbeat = createHeartbeat({ type: 'heartbeat', from: 'dev-app' });
ws.send(JSON.stringify(prodHeartbeat({ seq: 42 })));
ws.send(JSON.stringify(devHeartbeat({ seq: 43, debug: true }))));
不复杂但容易忽略:柯里化本身不解决 WebSocket 断连重发或超时检测,它只是让「构造合法心跳数据」这件事更可靠、更少出错。真正健壮的心跳机制还需配合连接状态监听与错误兜底逻辑。


















