Vue3-过期的副作用
竞态问题
在讲过期的副作用时,先引入一个话题,竞态问题。
举个栗子:watch监听obj的时候,第一次修改obj时,执行watch中的回调函数,发送请求A,短时间内又发生第二次修改obj,watch中的回调函数又被调用执行,发送请求B。由于请求返回的时间我们是无法预测的,可能会发生B的请求结果先返回设置给finalData,当请求A的结果返回时又设置给了finalData,导致第二次请求的结果与最终得到是第一次请求的结果。
如何解决呢?以下是一个针对这个问题的解决办法
解决办法
onInvalidata()函数
定义:该回调函数会在副作用下一次重新执行之前调用,可以用来清除无效的副作用,例如等待中的异步请求 原理:副作用函数(effect)重新执行之前,先触发onInvalidate
解析
第一次修改obj:
watch监听到obj发生变化,调用副作用函数(这里的副作用函数就是上面代码的async(newValue,oldValue,onInvalidate)=>{})。函数里面的onInvalidate()是不一定执行的,只有当前函数状态为过期时,才会被执行。
第二次修改obj:
watch监听到obj发生变化,调用副作用函数,在调用副作用函数之前,watch会先寻找有没有正在执行的副作用函数,如果有则该函数会被认为是过期的,第一次修改obj的副作用函数的onInvalidate被调用,expired赋值为true,无论第一次请求结果如何都无法赋值给finalDate。
转载自:https://juejin.cn/post/7363115064729387023