场景
百度搜索的时候,连续搜索了两次答案,然后没想到第一次请求的数据返回慢了,然而第二次的请求数据先出来了,第一次的请求数据后出来,如果按照平常来说,第一次的请求数据又给覆盖了之前的数据,这样就造成了一些问题

连续触发watch时需要清理之前的watch操作 达到以最后一次返回结果为准的目的
- 第一次调用watch回调函数时候 传入一个取消的回调
- 第二次调用watch回调函数的时候执行上一次传入的回调
const state= reactive({flag: true, name: 'lyp',address:{num: 6}, age: 30}) let i = 2000; // 模拟ajax 实现 第一次比第二次返回的晚 function getData(timer){ return new Promise((resolve,reject)=>{ setTimeout(() => { resolve(timer) }, timer); }) } // 每次数据变化 都会执行watch的回调函数 // 每次都会形成一个私有作用域 传入的onCleanup函数 执行改变的是上一个私有作用域的clear值 // onCleanup 是 vue源码提供给用户的钩子 watch(()=>state.age,async (newValue,oldValue,onCleanup)=>{ let clear = false; // 将 终止的调函数 给到vue源码中的cleanup(也就是传递给下一层) // 终止函数的调用会有vue源码自动执行 onCleanup(()=>{ clear = true; }) i-=1000; let r = await getData(i); // 第一次执行1s后渲染1000, 第二次执行0s后渲染0, 最终应该是0 if(!clear){document.body.innerHTML = r;} },{flush:'sync'}); // {flush:'sync'} 表示同步执行 state.age = 31; state.age = 32;