3,promise async/await settimeo
2021-09-09 本文已影响0人
kafya
这题主要考察的是这三者在事件循环中的区别,事件循环中分为宏任务队列和微任务队列。
- 其中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函数体。