0%

20200820题目

异步笔试题

题目

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 执行顺序详解