Event Loop

js是单线程,单线程中又分为同步任务,异步任务。
同步任务:在主线程上执行,前面任务没有执行完毕,后面的任务将一直等待执行。
异步任务:则是放在任务队列中,等待主线程所有任务执行完成后,通知任务队列把可执行的任务放到主线程上执行。异步任务放到主线程执行完成后,又通知任务队列把下一个任务放到主线程中执行。这个过程一直持续,直到所有的异步任务执行完毕,这个持续重复的过程就称为event loop,而一次循环就是一次tick。
异步任务又分为宏任务、微任务。
宏任务(macrotask):script代码、setTimeout、 setInterval等。
微任务(microtask):Promise, process.nextTick, Object.observe, MutationObserver。

执行过程:先执行宏任务,再执行微任务。
微任务是一次循环中,一直取一直取,直到所有的微任务队列全部执行完。宏任务,则是循环一次取一次。
如果在事件循环的过程中,又加了macrotask,则是将macrotask放到队尾,等到下一次循环,再执行,如果是microtask,则是放在本次循环的microtask队列的队尾,直到microtask队列清空。

console.log(1);
setTimeout(function () {
  console.log(2)
}, 0); 
new Promise(function (resolve) {
  console.log(3)    
  for (var i = 100; i > 0; i--) {
    i == 1 && resolve()
  }
  console.log(4)
}).then(function () {
  console.log(5)
}).then(function () {
  console.log(6)
});
console.log(7);
  • 因为script是宏任务,所以先放入到宏任务队列,优先执行,输出1。
  • 接下来遇到setTimeout,因为setTimeout是宏任务,会放到下一次异步任务队列中。
  • 初始化promise实例过程是同步任务,promise.then 是微任务,所以会输出3,4。继续向下执行,promise.then 是微任务,放到本次循环的微任务队列尾部。
  • 继续向下执行,遇到了console.log(7) 输出7。直到现在本次循环结束,再检查微任务中是否还有任务,确实还有上一次的promise.then ,输出5,6
  • 本次循环结束,继续下一次宏任务,setTimeout 输出2。
    结果是:1、3、4、7、5、6、2

你可能感兴趣的:(Event Loop)