此文首发于 https://lijing0906.github.io
前面的文章梳理了一下有关浏览器进程、事件循环机制、微任务和红任务、Promise的相关知识,这篇文章想讲讲有关这些知识的一些面试题。
参考文章
题目一
const promise = new Promise((resolve, reject) => {
console.log(1)
resolve()
console.log(2)
})
promise.then(() => {
console.log(3)
})
console.log(4)
// 输出结果如下:
// 1
// 2
// 4
// 3
解读:
- 代码从上往下被放入执行栈中,执行栈先执行所有的同步任务,当遇到异步任务时,把异步任务挂起,等待执行栈中没有同步任务了,就从任务队列中取出异步任务来执行。
Promise
的创建是同步的,因此会先打印1
,遇到异步任务resolve()
就把resolve()
推入事件队列- 继续执行
resolve()
之后的同步任务,所以打印2
- promise.then()是异步任务,等待执行栈空闲再执行
- 执行同步任务打印
4
- 执行栈中没有同步任务,取出异步任务开始执行,因此打印
3
题目二
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
}, 1000)
})
const promise2 = promise1.then(() => {
throw new Error('error!!!')
})
console.log('promise1', promise1)
console.log('promise2', promise2)
setTimeout(() => {
console.log('promise1', promise1)
console.log('promise2', promise2)
}, 2000)
// 执行结果如下:
/