一探究竟async/await、promise和setTimeout的执行顺序

149 阅读1分钟

1、 举例一道题

async function async1() { 
     console.log('async1 start'); 
     await async2(); 
     console.log('asnyc1 end'); 
} 
async function async2() { 
    console.log('async2'); 
} 

console.log('script start'); 

setTimeout(() => { 
    console.log('setTimeOut'); 
}, 0); 

async1(); 

new Promise(function (reslove) { 
    console.log('promise1'); 
    reslove(); 
}).then(function () { 
    console.log('promise2'); 
}) 

console.log('script end');

里边涉及到了async/await、promise、setTimeout,那么打印顺序应该是怎么样呢

async1.png

这是什么原因呢

2、 JS的事件循环机制

事件循环机制:主线程会不断从任务队列中按顺序执行任务,每执行完一个任务就会检查微任务队列是否为空,如果不为空,就会一次性执行完所有的微任务,然后再进入下一个循环去任务队列中取下一个任务执行

先同步再异步,遇到异步的先宏任务再微任务

  • setTimeout并不是直接把回调函数放进异步队列中了,而是在定时器时间后,把回调函数放进执行的异步队列中,当主线程为空闲状态,才会执行,否则到时间了也还不能执行;因为需要等到异步队列前面的异步函数执行完了,才会轮到
  • Promise、async/await:new Promise 是同步任务,而.then()函数是异步任务放到异步队列中;带async会返回一个Promise对象,如没有await则执行起来就是普通函数,如存在await,将阻塞await后续的代码,返回一个Promise对象,放入了微任务队列中,等await 函数同步代码执行完毕,才会执行后续代码

async2.png

3、 流程

async3.png


async4.png