2026-03-04 10:22:02
竞态问题(Race Condition) 是指在系统或进程中,输出结果依赖于不受控制的事件出现顺序或时机,尤其在异步操作中,多个并发请求的响应顺序错乱会导致非预期结果。
竞态问题的典型场景以输入框搜索为例:

在下一个请求开始前取消上一个未完成的请求,确保只有最新请求的响应被处理。
通过标记请求的过期状态,仅处理最新请求的响应,丢弃过期的结果。
onCleanup 是 watch 回调函数的第三个参数,用于注册副作用清理函数,其核心作用是解决竞态问题。
1. 中断请求的实现watch 内部通过 cleanup 变量保存用户传入的取消方法(如 cancel)。
每次监听回调触发时,先执行 cleanup 取消上一次请求,再更新 cleanup 为当前请求的取消方法。

通过闭包维护 expired 状态,标记上一次请求是否过期。
在 onCleanup 中注册过期标记函数,下次回调触发时修改上一次的 expired 为 true。
闭包确保每个请求的 expired 状态独立。
仅当 expired 为 false 时更新结果,避免竞态。
中断请求:通过 onCleanup 保存并执行取消方法,确保只有最新请求生效。
忽略结果:通过闭包标记请求状态,丢弃过期响应。
通过合理使用 onCleanup,可以高效避免 watch 中异步操作引发的竞态问题,提升应用的稳定性和用户体验。