3,promise async/await settimeout 区别

这题主要考察的是这三者在事件循环中的区别,事件循环中分为宏任务队列和微任务队列。

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

Promise

Promise本身是同步的立即执行函数,当在executor中执行resolvereject时候,此时的异步操作,会先执行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函数体。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容