持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
接下来就整点关于Promise的面试题目吧,一起把这些题目参悟了
在参悟以下这些面试题之前,我们还需要有点准备工作
- Promise的基本使用,then,catch,finally方法
- 事件循环(Event Loop)的执行顺序
如果以上几点你觉得自己可以,那就开始往下走吧!先来第一关
第一关
1.1
const promise1 = new Promise((resolve, reject) => {
console.log('promise1')
})
console.log('1', promise1);
过程分析:
- 首先遇见
new Promise
,之前介绍过Promise
一旦创建就会执行,所以执行构造函数中的promise1
- 之后遇见同步代码
1
,此时promise1
没有被resolve
或者reject
回调函数执行,所以状态还是pending
结果:
promise1
1 Promise {<pending>}
1.2
const promise = new Promise((resolve, reject) => {
console.log(1);
resolve('success')
console.log(2);
});
promise.then(() => {
console.log(3);
});
console.log(4);
过程分析:
- 首先遇见
new Promise
,执行里面的同步代码1
- 接着遇见
resolve('success')
,将promise
的状态从pending
变成resolved
- 最后遇见同步任务2
- 往下遇见
promise.then
是个微任务,加入到微任务列表 - 整段代码最后遇见同步代码4
- 检查微任务列表执行微任务3 结果:
1
2
4
3
1.3
const promise = new Promise((resolve, reject) => {
console.log(1);
console.log(2);
});
promise.then(() => {
console.log(3);
});
console.log(4);
过程分析:
- 首先遇见
new Promise
开始执行,遇见同步代码1和2 - 往下遇见
promise.then
,因为在promise
中没有resolve
或者reject
,所以promise
并不会执行 - 最后执行同步代码4 结果:
1 2 4
1.4
const promise1 = new Promise((resolve, reject) => {
console.log('promise1')
resolve('resolve1')
})
const promise2 = promise1.then(res => {
console.log(res)
})
console.log('1', promise1);
console.log('2', promise2);
执行过程:
- 首先遇见
new Promise
开始执行,里面遇见同步代码promise1
- 遇见
resole('resolve1')
,将promise
状态变为resolved
- 遇见
promise1.then()
加入微任务列表 - 执行同步代码
1,promise1
,打印promise1
的状态是resolved
- 执行同步代码
2,promise2
,打印promise2
的状态是pending
script
宏任务执行完毕,开始查找微任务列表,发现promise.then
这个微任务,开始执行,返回resolve1
结果:
promise1
1 Promise {<fulfilled>: "resolve1"}
2 Promise {<pending>}
resolve1
1.5
const fn = () => (new Promise((resolve, reject) => {
console.log(1);
resolve('success')
}))
fn().then(res => {
console.log(res)
})
console.log('start')
执行过程:
- 仔细读代码,返现函数
fn
将Promise
返回出去,而且函数fn
是在最上面的,首先执行new Promise
里面的代码 - 执行同步代码1
resolve('success')
将promise
的状态变为resolved
fn().then
微任务加入微任务列表- 执行宏任务中的同步代码
start
结果:
1
start
success
1.6
const fn = () =>
new Promise((resolve, reject) => {
console.log(1);
resolve("success");
});
console.log("start");
fn().then(res => {
console.log(res);
});
注意⚠️:这里的函数new Promise
是没有包裹在函数fn
中的
执行过程:
- 首先遇见
new Promise
发现它并没有被包裹在fn
里面,立即执行。 - 将
new Promise
加入微任务列表 - 遇见同步代码
start
- 此时
fn().then
并没有resolve
或者reject
,所以不执行 - 查找宏任务没有,执行微任务
new Promise
,执行同步代码1,之后将状态resolved
- 将
fn().then()
加入微任务列表,event loop
之后执行fn().then()
输出success
。 结果:
start
1
success
第一关有没有掉队的,有掉队的就仔细看看执行过程,多看看事件循环。没掉对的,咱们第二关见~