https://segmentfault.com/a/1190000015680531https://segmentfault.com/a/1190000015680531在下次 DOM 更新循环结束之后执行延迟回调。是微任务队列中最先执行的回调函数。
1.把cb函数放到回调队列里去,如果支持macroTask,则利用macroTask在下一个事件循环中执行这些异步的任务,如果不支持macroTask,那就利用microTask在下一个事件循环中执行这些异步任务。
2.我们用nextTick的时候,还可以有promise的写法。如果没有向nextTick中传入cb,并且浏览器支持Promise的话,我们的nextTick返回的将是一个Promise。所以,nextTick的写法也可以是如下这样的
nextTick().then(()=>{console.log("XXXXX")})
3.但是为什么执行macroTimerFunc或者microTimerFunc就会在下一个tick执行我们的回调队列呢?
macroTimerFunc:如果浏览器支持setImmediate,我们就用setImmediate,如果浏览器支持MessageChannel,我们就用MessageChannel的异步特性,如果两者都不支持,我们就降价到setTimeout
microTimerFunc:如果支持浏览器支持promise,就用promise实现。如果不支持,就降低到用macroTimerFunc