# setTimeout/Promise/Async区别

三者在事件循环中有着明显的区别,事件循环中分为宏任务队列和微任务队列。

  • setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行
  • promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行
  • async函数表示函数里面可能会有异步方法,await后面跟一个表达式,async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行

举例说明一下:

  1. setTimeout
console.log('script start')
setTimeout(()=>{
    console.log('settimeout')	
})
console.log('script end')	

// script start
// script end
// settimeout
  1. promise.then
console.log('script start')
let promise1 = new Promise(function (resolve) {
    console.log('promise1')
    resolve()
    console.log('promise1 end')
}).then(function () {
    console.log('promise2')
})
setTimeout(function(){
    console.log('settimeout')
})
console.log('script end')

// script start
// promise1
// promise1 end
// script end
// promise2
// settimeout
  1. async/await
async function async1(){
  console.log('async1 start');
   await async2();
   console.log('async1 end')
}
async function async2(){
   console.log('async2')
}

console.log('script start');
async1();
console.log('script end')

// script start
// async1 start
// async2
// script end
// async1 end