# setTimeout/Promise/Async区别
三者在事件循环中有着明显的区别,事件循环中分为宏任务队列和微任务队列。
- setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行
- promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行
- async函数表示函数里面可能会有异步方法,await后面跟一个表达式,async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行
举例说明一下:
- setTimeout
console.log('script start')
setTimeout(()=>{
console.log('settimeout')
})
console.log('script end')
// script start
// script end
// settimeout
- 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
- 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