Vue 3 中 watch 和 watchEffect 的竞态问题:如何避免旧请求覆盖新结果
在 Vue 3 项目里用 watch 或 watchEffect 监听筛选条件并发送请求,是再常见不过的场景。比如搜索框输入关键词后,每变一次就调一次接口,然后赋值给列表。如果用户的输入速度比接口返回速度快,就很可能出现先发出的请求后返回,把后发出请求的结果覆盖掉。页面显示的列表和当前输入框内容对不上,用户看到的是上一次搜索结果。这个问题本质是请求的竞态,而不是 Vue 响应式本身的问题。Vue 的 watch 回调默认不会等待上一次异步操作结束,每次触发都独立执行。解决办法通常分两类:在回调内部通过闭包或 onCleanup 做取消/忽略标记,或者借助 AbortController 真正中...