先出一条题,测试一下自己是否做对了,做对就说明你理解了,做错了就继续看下去吧。
// 执行一个宏任务
async function async1() {
console.log( 'async1 start');
await async2(); // 执行完 async2() 后,遇到微任务await,(await后面的代码)放入微任务队列
console.log( 'async1 end');
}
async function async2() {
console.log( 'async2');
}
console.log( 'script start');//同步任务
setTimeout(function() { // 遇到异步宏任务,放入宏任务队列
console.log( 'setTimeout');
}, 0)
async1();
new Promise (function ( resolve ) {
console.log( 'promise1');//同步任务
resolve(); // 遇到微任务,放入微任务队列
}).then(function() {
console.log( 'promise2');//异步微观任务
})
console.log( 'script end');
// 打印内容顺序如下:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
解答:
- js有分同步任务和异步任务,其中异步任务包括微观任务和宏观任务。
- 执行顺序:同步–>异步微观–>异步宏观
- 同步宏观:script(整体代码)、new promise
- 异步宏观任务的方法有:、setTimeout、setInterval、
- 微观任务的方法有:Promise.then、MutaionObserver、process.nextTick(Node.js 环境),async/await。
- 整体是个宏观任务,先一步一步执行同步任务,执行完同步任务之后就会查看异步任务事件队列,并将其中的微观任务依次执行完,形成循环,等微观任务执行完,最后才执行异步中的宏观任务。
- 注意:new promise是同步任务,只有promise.then中的才是异步微观任务,asyns/await–>await后面的代码又会形成一个微观任务放进队列中。
- 看到这里你再回头看看前面那道题,结合注释看,你是否懂了呢