这题主要考察的是这三者在事件循环中的区别,事件循环中分为宏任务队列和微任务队列。
- 其中setTimeout的回调函数放到宏任务队列中,等到执行栈清空后执行;
-
promise.then里的回调函数会放到相应宏任务的微任务里,等宏任务里的同步代码执行完再执行 -
async函数表示函数里可能会有异步方法,awit后面跟一个表达式,async方法执行时,遇到await会立即执行表达式,然后表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行。
Promise
Promise本身是同步的立即执行函数,当在executor中执行resolve或reject时候,此时的异步操作,会先执行then/catch等,当主栈完成后,才会去调用resolve/reject中存放的方法执行
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
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log("async2 start");
setTimeout(function () {
console.log("async2 setTimeout");
}, 0);
console.log("async2 end");
}
setTimeout(function () {
console.log("setTimeout");
}, 0);
console.log("script start");
async1();
console.log("script end");
// script start --> async1 start -> async2 start -> async2 end -> script end ->async1 end -> setTimeout ->async2 setTimeout
async 函数返回一个Promise对象,当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,在执行函数体内后面的语句,可以理解为,让出线程,跳出async函数体。








网友评论