js事件循环
javascript是一门单线程语言
事件循环(Event Loop)是js实现异步的一种方法,也是js的执行机制
同步任务和异步任务
- 同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。
- 当指定的事情完成时,Event Table会将这个函数移入Event Queue。
- 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。
- 上述过程会不断重复,也就是常说的Event Loop(事件循环)。
macro-task(宏任务):包括整体代码script,setTimeout,setInterval
micro-task(微任务):Promise,process.nextTick
事件循环的顺序,决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。
1 console.log('1'); 2 3 setTimeout(function() { 4 console.log('2'); 5 process.nextTick(function() { 6 console.log('3'); 7 }) 8 new Promise(function(resolve) { 9 console.log('4'); 10 resolve(); 11 }).then(function() { 12 console.log('5') 13 }) 14 }) 15 process.nextTick(function() { 16 console.log('6'); 17 }) 18 new Promise(function(resolve) { 19 console.log('7'); 20 resolve(); 21 }).then(function() { 22 console.log('8') 23 }) 24 25 setTimeout(function() { 26 console.log('9'); 27 process.nextTick(function() { 28 console.log('10'); 29 }) 30 new Promise(function(resolve) { 31 console.log('11'); 32 resolve(); 33 }).then(function() { 34 console.log('12') 35 }) 36 })
输出结果:1,7,6,8,2,4,3,5,9,11,10,12