由$nextTick() 理解js异步宏任务和微任务

2 篇文章 0 订阅

在vue框架开发中,我们经常会用到nextTick()方法,官方的解释是:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM,那么在哪些实际场景中去使用呢,它的原理是什么呢?我们接着往下看

nextTick()方法主要是用在数据改变,dom改变应用场景中。我们知道js是单线程,异步任务会放到事件队列中,等待同步任务执行完毕之后再执行。由于vue中数据和dom渲染是异步的,所以,要让dom结构随数据改变这样的操作都应该放进nextTick()的回调函数中。在created()中使用时,dom还没有渲染,此时就可以使用nextTick(),但是mounted()的钩子函数则是在dom完全渲染后才开始渲染数据,所以在mounted()中操作dom基本不会存在渲染问题。

但是假如和我们经常用到的setTimeout()一起使用,结果顺序会是怎样的呢,如果还有Promise呢?


setTimeout(() => {
    //执行后 回调一个事件
    console.log('事件1')
}, 0)
console.log('事件2');
this.$nextTick(function() {
    console.log('事件3');
})
new Promise((resolve) => {
    console.log('事件4');
    resolve()
}).then(() => {
    console.log('事件5');
})

执行顺序为:
执行顺序
分析:
setTimeout异步事件,放入异步任务队列;
事件2所在行是主线程,直接执行;
事件3所在行也异步事件,放入异步任务队列;
创建promise的new Promise是主线程,直接执行;
Promise中的then方法为异步函数,放入异步任务队列;
可能小伙伴就会疑惑了,那顺序不应该是2 4 1 3 5 吗?其实不然,异步事件也是分执行顺序的!
宏任务(macrotask )和微任务(microtask )表示异步任务的两种分类,同一个队列中先执行微任务,再执行宏任务。
宏任务包括

  • setTimeout
  • setInterval
  • setImmediate
  • requestAnimationFrame
    微任务包括:
  • process.nextTick
  • MutationObserver
  • Promise.then catch finally

所以在上面的例子中,3,5是属于微任务,优先于1执行。

以上就是js 执行机制了,只要理解js 的执行机制,那么童鞋们在开发的过程中就不会出现写的,想的和执行的不一致的情况了!

参考链接:js 宏任务和微任务

谁能仅靠十年寒窗苦读,去经营百岁人生?
活到老,学到老!
知识改变人生!
共勉!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值