本文小编为大家详细介绍“vue3调度器effect的scheduler功能怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3调度器effect的scheduler功能怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。说到scheduler
,也就是vue3
的调度器,可能大家还不是特别明白调度器的是什么,先大概介绍一下。可调度性是响应式系统非常重要的特性。首先我们要明确什么是可调度性。所谓可调度性,指的是当trigger
动作触发副作用函数重新执行时,有能力决定副作用函数执行的时机、次数以及方式。有了调度函数,我们在trigger
函数中触发副作用函数重新执行时,就可以直接调用用户传递的调度器函数,从而把控制权交给用户。举个栗子:首先在副作用函数中打印obj.foo
的值,接着连续对其执行两次自增操作,输出如下: 1
2
3由输出结果可知,obj.foo
的值一定会从1自增到3,2只是它的过渡状态。如果我们只关心最终结果而不关心过程,那么执行三次打印操作是多余的,我们期望的打印结果是: 1
3那么就考虑传入调度器函数去帮助我们实现此功能,那由此需求,我们先来实现一下scheduler功能。首免费云主机域名先还是藉由单测来梳理一下功能,这是直接从vue3
源码中粘贴过来对scheduler的
单测,里面很详细的描述了scheduler
的功能。大概介绍一下这个单测的流程:通过 effect
的第二个参数给定的一个对象 { scheduler: () => {} }
, 属性是scheduler
, 值是一个函数;effect
第一次执行的时候, 还是会执行 fn
;当响应式对象被 set
,也就是数据 update
时, 如果 scheduler
存在, 则不会执行 fn
, 而是执行 scheduler
;当再次执行 runner
的时候, 才会再次的执行 fn
.那接下来就直接开始代码实现功能,这里直接贴出完整代码了,// + 会标注出新增加的代码。代码实现完成,那接下来看一下单测结果。好,现在我们再回到最初的栗子????,在上面scheduler
基础上,完成现有需求,继续看一下对此需求的单测。在分析上段代码之前,为了辅助完成上述功能,我们需要回到trigger
中,调整一下遍历执行,为了让我们的scheduler
能拿到原始依赖。再观察上面的单测代码,首先,我们定义了一个任务队列jobQueue
,它是一个Set
数据结构,目的是利用Set
数据结构的自动去重功能。接着我们看调度器scheduler
的实现,在每次调度执行时,先将当前副作用函数添加到jobQueue
队列中,再调用flushJob函数刷新队列。然后我们把目光转向flushJob
函数,该函数通过isFlushing
标志判断是否需要执行,只有当其为false
时才需要执行,而一旦flushJob
函数开始执行,isFlushing
标志就会设置为true,意思是无论调用多少次flushJob
函数,在一个周期内都只会执行一次。需要注意的是,在flushJob
内通过p.then
将一个函数添加到微任务队列
,在微任务队列
内完成对jobQueue
的遍历执行。整段代码的效果是,连续对obj.foo
执行两次自增操作,会同步且连续地执行两次scheduler
调度函数,这意味着同一个副作用函数会被jobQueue.add(fn)
添加两次,但由于Set
数据结构的去重能力,最终jobQueue
中只会有一项,即当前副作用函数。类似地,flushJob
也会同步且连续执行两次,但由于isFlushing
标志的存在,实际上flushJob
函数在一个事件循环内只会执行一次,即在微任务队列内执行一次。当微任务队列开始执行时,就会遍历jobQueue
并执行里面存储的副作用函数。由于此时jobQueue
队列内只有一个副作用函数,所以只会执行一次,并且当它执行时,字段obj.foo
的值已经是3了,这样我们就实现了期望的输出。再跑一遍完整流程,来看一下单测结果,确保新增代码不影响以往功能。测试结束完以后,由于job queue
是一个实际案例单测,所以我们将其抽离到examples
下面的testCase
里,建立jobQueue.spec.ts
。读到这里,这篇“vue3调度器effect的scheduler功能怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。
这篇文章主要介绍“redisson特性如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“redisson特性如何实现”文章能帮助大家解决问题。相信看了这个标题的同学,对这个问题以已经非常不陌生了,信手拈来redis…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。