本文共 927 字,大约阅读时间需要 3 分钟。
先举一个列子
console.log('start');setTimeout(() => { console.log('timeout');});Promise.resolve().then(() => { console.log('resolve');});console.log('end');
主线程从任务队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。
上图中,主线程运行的时候,产生堆(heap)和栈(stack),栈中的代码调用各种外部API,它们在任务队列中加入各种事件(click,load,done)。只要栈中的代码执行完毕,主线程就会去读取任务队列,依次执行那些事件所对应的回调函数。
在Javascript的Event Loop机制中,存在两个任务队列:Macrotask queue(宏队列)和Microtask queue(微队列)。
如果你想让一个异步任务尽快执行,那么就把它设置为Microtask,除此之外都用Macrotask。因为,虽然Javascript是异步非阻塞的,但在一个事件循环中,Microtask的执行方式基本上就是用同步的。
Event Loop的循环机制