watch

watch中,如果我们观察一个属性,例如obj.foo
如果foo发生改变,发送请求,将请求结果赋值给 test
乍一看没有问题,但是如果这期间连续请求,
因为我们无法确定A返回的结果是否先于B返回的结果
就可能会发生如下
vue3 - 图1
针对这种问题,watch给我们提供了onInvalidate函数进行注册过期回调函数
watch(obj.foo,async(new,old,onInvalidate)=>{
//定义一个标志代表当前副作用是否过期,默认false,表示没过期
let expired=false0
//注册过期回调
onInvaalidate(()=>{
//当过期时(也就是有新值进入进来)
expired=true
})
//发送网络请求
const res= await fet(‘dsadsa’)
if(!expied){
test=res
}]})

Reflect

有如下方法
Reflect.get()

  1. //以下2种方法等价
  2. const obj={fool:1}
  3. //直接读取
  4. console.log(obj.fool) //1
  5. //使用Refelct.get()
  6. Refelct.get(obj,'fool') // 1
  7. 有人就问了, 为什么读取都一样,为什么要加这样一个Refelct全局对象呢?
  8. 其实Refelct.get()方法还有第三个参数receiver,你可以把他理解为函数调用过程中的this指向
  9. 那有了这点我们就能做很多事情了

Reflect.set()
Reflect.apply()