面试题 什么是Promise Promise的概述

90 阅读2分钟

面试题 什么是Promise Promise的概述

什么是promise

promise就是异步函数的一种解决方式,主要就是用来解决回调地狱

Promise 会有三种状态

-   Pending 等待
-   Resolved (*fulfilled*) 完成
-   Rejected 失败

状态只能由 Pending --> Resolved 或者 Pending --> Rejected,且一但发生改变便不可二次修改;

Promise 中使用 resolve 和 reject 两个函数来更改状态;

then 方法内部做但事情就是状态判断

-   如果状态是成功,调用成功(resolve)回调函数
-   如果状态是失败,调用失败(reject)回调函数

执行过程

常用的Promise的API

Promise.all(iterable)

这个方法返回一个新的 promise 对象,等到所有的 promise 对象都成功或有任意一个 promise 失败。

使用场景:一次调用多个接口的,需要同时拿到他们的数据

弊端:一次获得多个接口,只要有一个失败,就会走到catch,并结束该进程。但是这个弊端es11的时候被Promise.allSettled解决了,失败也会被正常打印出来

Promise.race(iterable)

这个方法,只要有一个promise的状态发生改变了,就会结束该该进程,同时打印发生变化的状态(亦称为竞赛模式,谁第一,就打印谁)

实例方法

Promise.prototype.catch()

为 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()