【Vue原理】NextTick - 源码版 之 宏微任务的抉择

写文章不容易,点个赞呗兄弟
专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧
研究基于 Vue版本 【2.5.17】

如果你觉得排版难看,请点击 下面链接 或者 拉到 下面关注公众号也可以吧

【Vue原理】NextTick - 源码版 之 宏微任务的抉择

nextTick 已经写了三篇文章啦,这是最后一篇源码版,没看过的童鞋可以看看白话版简单了解下拉

【Vue原理】NextTick - 白话版 简单了解下NextTick

<
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue2中的nextTick方法是用来在下一次DOM更新循环结束之后执行延迟回调的方法。它的核心原理是利用了浏览器的异步任务队列机制,将回调函数加入到任务队列中,在下一次DOM更新循环结束之后执行。 具体实现原理如下: 1. nextTick方法会先判断是否已经有一个回调队列,如果没有就创建一个空数组作为队列。 2. 将回调函数加入到队列中。 3. 判断是否已经有一个异步任务,如果没有就创建一个异步任务,并将其加入到任务队列中。 4. 当异步任务执行时,会依次执行回调函数队列中的所有函数。 下面是nextTick码: ```javascript export function nextTick (cb?: Function, ctx?: Object) { let _resolve callbacks.push(() => { if (cb) { try { cb.call(ctx) } catch (e) { handleError(e, ctx, 'nextTick') } } else if (_resolve) { _resolve(ctx) } }) if (!pending) { pending = true if (useMacroTask) { macroTimerFunc() } else { microTimerFunc() } } // $flow-disable-line if (!cb && typeof Promise !== 'undefined') { return new Promise(resolve => { _resolve = resolve }) } } ``` 其中callbacks是一个数组,用来保存回调函数队列。pending表示是否已经有一个异步任务在执行,useMacroTask表示是否使用任务,用来区分不同的环境(浏览器、node等)。 在上面的代码中,先把回调函数加入到队列中,然后判断是否已经有一个异步任务在执行。如果没有,就创建一个异步任务并加入到任务队列中。如果使用任务,就使用setTimerout来创建异步任务,如果不使用任务,就使用任务(Promise)。 最后,如果没有传入回调函数,但是环境支持Promise,则返回一个Promise对象,以便在异步任务执行完毕后可以进行链式调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值