书接之前代码输出题目,
前端面试题之代码输出
前端面试题之代码输出二
前端面试题之代码输出三
前端面试题之代码输出四
前端面试题之代码输出五
前端面试题之代码输出六
前端面试题之代码输出七
前端面试题之代码输出八
前端面试题之代码输出九
异步&事件循环
19.代码输出结果
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
setTimeout(() => {
console.log('timer1')
}, 0)
}
async function async2() {
setTimeout(() => {
console.log('timer2')
}, 0)
console.log("async2");
}
async1();
setTimeout(() => {
console.log('timer3')
}, 0)
console.log("start")
输出结果如下:
async1 start
async2
start
async1 end
timer2
timer3
timer1
代码执行顺序如下:
- 首先进入
async1
,打印async1 start
- 之后遇到
async2
,进入async2
,遇到定时器timer2
,加入宏任务队列,之后打 印async2
- 由于
async2
阻塞了后面代码的执行,所以执行后面的定时器timer3
,将其加入宏任 务队列,之后打印start
- 然后执行
async2
后面的代码,打印出async1 end
,遇到定时器timer1
,将其加入宏任务队列 - 最后,宏任务队列有三个任务,先后顺序为
timer2
,timer1
,timer3
,没有微任务,所以直接所有的宏任务按照先进先出的原则执行
20.代码输出结果
async function async1() {
console.log('async1 start');
await new Promise(resolve => {
console.log('promise1')
})
console.log('async1 success');
return 'async1 end'
}
console.log('srcipt start')
async1().then(res => console.log(res))
console.log('srcipt end')
输出结果如下:
srcipt start
async1 start
promise1
srcipt end
代码执行顺序如下:
这里需要注意的是在 async1
中 await
后面的 Promise
是没有返回值的,也就是它的状态始终是 pending
状态,所以在 await
之后的内容是不会执行的,包括 async1
后面的 .then