1、事件循环面试题一
async function fn1() {
console.log(1)
await fn2()
console.log(2)
}
async function fn2() {
console.log('fn2')
}
fn1()
console.log(3)
await
会阻塞下面的代码(即加入微任务队列),先执行async
外面的同步代码,同步代码执行完,再回到async
函数中,再执行之前阻塞的代码
2、事件循环面试题二
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')
})
async1()
new Promise(function (resolve) {
console.log('promise1')
resolve()
}).then(function () {
console.log('promise2')
})
console.log('script end')
1、遇到console.log('script start')直接打印 script start
2、遇到setTimeout宏任务,不处理
3、遇到
async1()
,执行函数,打印async1 start, 遇到
await 先执行async2(),执行函数打印 async2 ,await 堵塞下面代码加入微任务列跳出
async1()函数执行同步代码
4、遇到new Promise直接执行,打印promise1 resolve()
从“未完成”变为“成功”,异步执行加入微任务列跳出执行同步代码5、遇到console.log('script end')直接打印 script end 代码上下文执行结束开始循环查找可执行的微任务
6、微任务列 打印await 堵塞得 console.log('async1 end') 打印 async1 end
7、执行
resolve()执行的then(function () {
console.log('promise2')
}) 打印promise2
8、发现微任务无任务,没有开始循环查找可执行的宏任务 console.log('settimeout')打印settimeout
3、事件循环面试题三
console.log('script start');
setTimeout(function() {
console.log('setTimeout1');
Promise.resolve().then(function() {
}).then(function() {
console.log('promise5');
setTimeout(function() {
console.log('setTimeout3');
}, 0);
});
}, 0);
Promise.resolve().then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
Promise.resolve().then(function() {
console.log('promise3');
}).then(function() {
console.log('promise4');
setTimeout(function() {
console.log('setTimeout2');
}, 0);
});
});
console.log('script end');