promise面试题
2023-02-14 本文已影响0人
靴唯白
常见问题:
- 是否可以用 return 代替 promise?
答:不可以,无法实现链式调用,也无法改变状态 - 使用 throw 还是 reject?
答:Promise的构造函数,以及被then调用执行的函数都可以被认为是在try-catch的代码块中执行的,所以在这些代码中即使使用throw,程序本身也不会因为异常而发生改变,promise的状态也不会发生改变。
promise执行时间:
- resove 后面的代码会不会被执行?
new Promise 会立即执行,reslove之后的输出也会继续打印,而且是首先打印出来,then是异步执行的
const testReturn = (a) => {
return new Promise((resolve, reject) => {
if(a) {
resolve('exec true')
console.log('this will be exec')
} else {
reject('false')
}
})
}
testReturn(true).then(str => {
console.log(str)
})
// 执行结果:
// this will be exec
// exec true
答:当没有error的时候,resolve会将Promise.then放在微任务队列中,当所有的宏任务执行结束的时候,执行微任务队列。
当有error的时候,error后面的代码不会执行,但是Promise的结果依然是fullfilled
- 当 Promise 遇到 setTimeout
- 宏任务:script setTimeout setInterval requrestAnimationFrame
- 微任务:new promise().then(回调) process.[nextTick]
分析:
const testReturn = (a) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (a) {
resolve("111");
console.log("222");
} else {
reject("333");
}
});
console.log("444");
});
};
testReturn(true)
.then((str) => {
console.log("555");
})
.catch((err) => {
console.log('666');
});
// 执行结果:
// 444
// 222
// 555
此题分析图