异步笔试题
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| async function async1() { console.log('async1 start'); await async2(); 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
- promise2
- async1 end
- setTimeout
实际
- cript start
- async1 start
- async2
- promise1
- script end
- async1 end
- promise2
- setTimeout
错误的地方
- 微任务的顺序自己理解有问题,promise1 跟async1 end 这两个地方,我以为是应该先执行then里面的内容,但实际还是按照微任务的队列进行执行.
解释
- js是单线程,会先执行script start
- settimeout 是宏任务,不会先执行,直接到async1(),输出async 1 start
- 在async1 里面执行async2,输出async2,有await,让出线程
- 执行new promise 输出 promise1
- then方法等待,输出 script end
- script宏任务队列清空,开始执行微任务,输出async1 end
- 执行微任务队列,输出promise2
- 微任务队列晴空,开始下一个宏任务 settimeout
最高赞题解
参考链接
ECMAScript 6 入门
从一道题浅说 JavaScript 的事件循环
async/await 执行顺序详解