when:Vue什么时候用到异步事件队列
1、VUE通过设置对象属性的setter拦截,可以在属性值发生变化时触发相关依赖,这时的依赖回调默认不是立即执行,而是将其放入到异步事件队列。
2、调用nextTick方法时,nextTick是将回调方法放入到异步事件队列,不立即触发。
what:异步事件队列的触发
因为JS是单线程执行的,同一时刻只能执行一处代码,如果遇到耗时长的任务如ajax请求之类的,等待会过长。
所以在单线程的基础上,多了异步事件队列的概念,这种耗时长的任务由底层开辟出单独的线程去处理,处理成功后,往异步事件队列插入回调。
JS主流程执行结束之后,会定时去异步事件队列里检索是否有回调,若有,将其出队由主任务执行,依次循环
![](https://img.haomeiwen.com/i1986733/9faf7262c509d0b9.png)
如
Vue.nextTick(function(){
console.log("tick")
})
for(var index=0;index<3;index++){
console.log(index);
}
sleep(1000);//自定义函数,表示睡眠1s
打印结果会是:
0
1
2
(等待1s多的时间)
tick
how:异步事件队列实现原理
通过Promise对象或是setTimeout都可以实现
Promise.resolve().then(fn),setTimeout(fn,0), js引擎都会将其放入异步事件队列
如
var promise=Promise.resolve();
var isTrigger=false;
var queueTasks=[];
function startQueueTask(){
var task=queueTasks.splice(0);
task.forEach(function(fn){
fn();
})
isTrigger=false;
}
function nextTick(fn){
queueTasks.push(fn);
if(!isTrigger){
isTrigger=true;
promise.then(startQueueTask);
}
}
nextTick(function(){console.log(1)})
nextTick(function(){console.log(2)})
console.log(3)
console.log(4);
网友评论