可调度性是响应式系统非常重要的特性。所谓可调度性,指的是当trigger动作触发副作用函数重新执行时,有能力决定副作用函数执行的时机、次数以及方式。这里,我只对调度的次数做一个简单的描述。
首先我们来看一段简单的代码
const data = {foo : 1}
const obj = new Proxy(data,{
/*.....*/})
effect(() => {
console.log(obj.foo)
})
obj.foo++
obj.foo++
这段代码不难理解,很容易就可以判断出输出的结果为 1 2 3。由输出可知,obj.foo的值会由1自增到3,2只是一个过渡状态,如果我们想要的只是得到一个结果3,而不去关心过程,那么,执行并打印出的2便是多余的,我们期望的打印结果是1 3
基于调度器我们可以很容易的实现此功能:
//定义一个任务队列
const jobQueue = new Set()
//创建一个promise实例,将一个任务添加到微任务队列
const p = Promise.resolve()
//是否正在刷新队列
let isFlushing = false
function flushJob(){
//如果队列正在刷新,什么也不做
if(isFlushing) return
//将状态设置为true
isFlushing = true
//在微任务队列中刷新jobQueue队列
p.then(() =>{
jobQueue.forEach(job => job())
}).finally(() =>{
//结