编辑写到一半停了两分钟,再动键盘时内容跳回旧版本,刚补的两段话没了。后台日志里同一篇文章有三条保存记录,时间挨得很近。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
let saving = false;
async function autosave() {
if (saving) return;
saving = true;
const rev = ++version;
await fetch('/api/draft', { method: 'POST', body: JSON.stringify({ rev, content }) });
saving = false;
}
定时器和输入触发的两次保存并发跑,定时那次带着更早的内容快照,返回顺序还排在后面。后到的旧数据直接覆盖新内容,没有版本号可比。这一点先确认清楚,后面就不用反复试。
「自动保存覆盖」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
具体做法是,保存请求带上内容版本号和客户端时间,服务端只接受版本更大的写入;上一次请求没返回就不再发新的,合并成一次待发;把保存结果回填编辑器,冲突时提示并保留两份。
改完照着核一遍,连续快速编辑五分钟,文章内容不回退,草稿表里的版本号只增不减。
