概念

抽象表达

  • promise 是用来解决异步编程(callback)回调地狱(callback hell)的一个解决方案

具体表达

  • 从语法上来说:promise 是一个构造函数
  • 从功能上来说:promise 是对象封装了一个异步操作并且能获取到其结果

状态

Promise 三种状态

  • pending
  • fulfilled
  • rejected


有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数

基础 api

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//new Promise 实例
const p = new Promise((resolve, reject) => {
//开始执行异步操作
setTimeout(() => {
//获取当前时间
let time = Date.now();
//判断偶数
if (time % 2 === 1) {
resolve("成功的回调", time);
} else {
reject("失败的回调", time);
}
}, 0);
});

//通过.then 来指示成功和失败的结果
p.then(
(value) => {
console.log(value, "成功的数据");
},
(reason) => {
console.log(reason, "失败的数据");
}
);

常用方法

  • then
  • catch
  • all
  • any
  • finally
  • resolve 构造方法
  • reject 构造方法

all

Promise.all([p1,p2,p..])
接收一个由 promise 组成的数组,成功将返回所有 promise 成功的结果,有一个状态是 reject 将执行 catch

race

Promise.race([p1,p2,p…])
接收一个由 promise 组成的数组,有一个 promise 状态是 resolve,那么就返回第一个状态是 resolve 的 promise 的结果

为什么使用 Promise

1、指定回调函数的方式更加灵活、

  • 旧的:必须在启动异步任务前指定
  • promise:启动异步任务 => 返回 promise 对象 => 给 promise 对象绑定回调函数(甚至可以异步任务结束后指定/多个)

2、支持链式调用,可以解决回调地狱问题

  • 什么是回调地狱 ? 回调函数嵌套调用, 外部回调函数异步执行的结果是嵌套的回调函数执行的条件
  • 回调地狱的缺点 ? 不便于阅读 / 不便于异常处理
  • 解决方案 ? promise 链式调用
  • 终极解决方案 ?async/await