面试题 什么是Promise Promise的概述
什么是promise
promise就是异步函数的一种解决方式,主要就是用来解决回调地狱
Promise 会有三种状态
- Pending 等待
- Resolved (*fulfilled*) 完成
- Rejected 失败
状态只能由 Pending --> Resolved 或者 Pending --> Rejected,且一但发生改变便不可二次修改;
Promise 中使用 resolve 和 reject 两个函数来更改状态;
then 方法内部做但事情就是状态判断
- 如果状态是成功,调用成功(resolve)回调函数
- 如果状态是失败,调用失败(reject)回调函数
执行过程
常用的Promise的API
这个方法返回一个新的 promise 对象,等到所有的 promise 对象都成功或有任意一个 promise 失败。
使用场景:一次调用多个接口的,需要同时拿到他们的数据
弊端:一次获得多个接口,只要有一个失败,就会走到catch,并结束该进程。但是这个弊端es11的时候被Promise.allSettled解决了,失败也会被正常打印出来
这个方法,只要有一个promise的状态发生改变了,就会结束该该进程,同时打印发生变化的状态(亦称为竞赛模式,谁第一,就打印谁)
实例方法
为 promise 添加一个被拒绝状态的回调函数,并返回一个新的 promise,若回调函数被调用,则兑现其返回值,否则兑现原来的 promise 兑现的值。
promise如何解决回调地狱
通过promise的链式调用把已经执行的promise和未执行的promise关联起来
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('foo');
}, 300);
});
myPromise
.then(handleResolvedA) //.then(handleResolvedA,handleRejectedA)
.then(handleResolvedB)
.then(handleResolvedC)
.catch(handleRejectedAny);//错误的捕获
新语法糖async和await
async function foo() {
const result1 = await new Promise((resolve) => setTimeout(() => resolve('1')))
const result2 = await new Promise((resolve) => setTimeout(() => resolve('2')))
const result3 = await new Promise((resolve) => setTimeout(() => resolve('3')))
}
foo()