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,那么打印顺序应该是怎么样呢
这是什么原因呢
2、 JS的事件循环机制
事件循环机制:主线程会不断从任务队列中按顺序执行任务,每执行完一个任务就会检查微任务队列是否为空,如果不为空,就会一次性执行完所有的微任务,然后再进入下一个循环去任务队列中取下一个任务执行
先同步再异步,遇到异步的先宏任务再微任务
- setTimeout并不是直接把回调函数放进异步队列中了,而是在定时器时间后,把回调函数放进执行的异步队列中,当主线程为空闲状态,才会执行,否则到时间了也还不能执行;因为需要等到异步队列前面的异步函数执行完了,才会轮到
- Promise、async/await:new Promise 是同步任务,而.then()函数是异步任务放到异步队列中;带async会返回一个Promise对象,如没有await则执行起来就是普通函数,如存在await,将阻塞await后续的代码,返回一个Promise对象,放入了微任务队列中,等await 函数同步代码执行完毕,才会执行后续代码