promise面试题

2023-02-14  本文已影响0人  靴唯白

常见问题:

  1. 是否可以用 return 代替 promise?
    答:不可以,无法实现链式调用,也无法改变状态
  2. 使用 throw 还是 reject?
    答:Promise的构造函数,以及被then调用执行的函数都可以被认为是在try-catch的代码块中执行的,所以在这些代码中即使使用throw,程序本身也不会因为异常而发生改变,promise的状态也不会发生改变。

promise执行时间:

  1. 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

  1. Promise 遇到 setTimeout

分析:

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
此题分析图
上一篇 下一篇

猜你喜欢

热点阅读