Promise面试题
一、基础的问题
1、什么是Promise?
promise可以处理异步操作,具有链式调用和状态管理,两者结合可以避免回调地狱,使得流程更加的清晰。
2、Promise的状态有哪些?
promise有三种状态:pending、Fulfilled、Rejected
pending状态是promise中的.then方法返回了一个新的promise的对象,此时这个新的promise对象的状态就是pending(进行中),等待结果的状态,但是这个promise的对象接下来的状态的改变要看前一个.then里面的回调返回的结果。
Fulfilled状态是前一个.then里面的回调Resolve返回结果之后,promise对象从pending状态转换为Fulfilled
Rejected状态是前一个.then里面的回调Reject返回结果之后,promise对象从pending状态转换为Rejected
3、如何创建一个Promise?
直接使用promise的构造函数来创建promise对象,promise个构造函数中具有两个参数,resolve和reject,这两个参数是用来改变promise状态的,操作成功,就调用resolve函数,使其状态从pending转变为Fulfilled。操作失败,就调用reject函数,使其状态从pending转变为Rejected
4、Promise的链式调用是什么?
promise内部组成是由多个.then方法和一个.catch方法组成,所有的then方法都会同时返回一个全新的promise的对象,此时这些promise对象的状态是pending,每个then方法返回的promise对象状态的改变都要先等前一个then方法的返回结果来决定,依次下去,形成链式调用
5、如何处理多个Promise的并行执行?
并行操作就是把好几个promise同时放入一些方法中,promise提供了Promise.all和Promise.race两个方法来执行,其中Promise.all方法是要等所有promise执行完成并且返回成功的结果才会调用,Promise.race方法只要里面并行执行的promise有一个返回成功的结果就会被调用。
6、Promise和回调函数有什么不同?
promise是一个状态管理,但是这些状态的改变取决于其内部的回调函数。所以promise和单纯的回调函数还是有很大的区别的。
7、如何处理Promise中的错误?
promise的调用过程中,如果发生了错误,会沿着promise链找最近的then方法内部的catch(),而不会走then()方法的try,这在promise中也叫作异常穿透,除此之外,还有一种直接处理错误的办法,就是直接中断promise链,直接将错误传到promise对象的.catch(),而不会沿着promise链走then方法里面的catch
8、Promise和 async / await 之间有什么关系?
两者都是关键字,但是作用不同,async关键字是创建一个异步函数,在await是在里面使用的关键字,用来创建等待任务,就好比promise中的then一样
async/await是一种在Promise之上构建的更高级的异步编程方式,它使得异步代码更易于理解和编写,并提供更清晰的控制流。async函数可以包含await关键字,用于等待异步操作的结果。async/await不仅限于Promise,可以用于处理多种异步操作。
9、什么是Promise的错误处理机制?
promise里面的错误处理有两种,promise的catch和promise里面then方法的error。一般情况下发生错误的时候会沿着promise链找最近的then里面的error,如果没解决就会一直往下找,这也叫作异常穿透,还有一种情况是这个错误直接导致了promise链中断,那就不会沿着promise链往下找then方法里面的error,而是会将这个错误交给promise的catch去解决
10、 如何处理嵌套Promise?
嵌套promise有两种常用的方法,第一种是在promise对象内部的then方法里面创建新的promise对象,实现嵌套promise。第二种是在async/await里面使用await关键字重新创建一个新的promise,也可以实现嵌套promise