1、Promise简介
- Promise 能够接收一个异步请求,在提供的 then/catch 方法中拿到异步请求的处理结果
- Promise 支持链式调用,通过链式调用的方式能够将异步请求的结果以同步的方式进行处理
2、Promise基本使用
// Promise 的参数是一个回调函数,其中包含了两个参数:resolve 和 reject;
// 当异步操作成功时,通过调用 resolve 返回异步操作的成功结果;
// 当异步操作失败时,通过调用 reject 返回异步操作的失败结果;
let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if ('异步请求成功') {
      resolve('ok')
    } else {
      reject('error')
    }
  }, 1000)
})
// 异步操作成功时,进入 then 处理后续操作;
// 异步操作失败时,进入 catch 处理后续操作;
promise
  .then((res) => {
    console.log(res)
  })
  .catch((err) => {
    console.log(err)
  })
// 当then函数的第二个回调定义时,也可以捕捉失败操作
promise.then(
  (res) => {
    console.log(res)
  },
  (err) => {
    console.log(err)
  }
)
3、Promise的作用
- Promise 不仅解决了异步回调的多层嵌套,即“回调地狱”;
- 通过 Promise 构造函数上提供的方法,实现对 Promise 批量操作的支持,如:all、race、any、allSettled 等;
4、Promise兼容性
- Chrome 浏览器 - 支持
- 360 浏览器 - 兼容模式下支持
- IE 内核浏览器 - 不支持
bluebird.js 在项目中使用 Promsie 对象,可以使用第三方插件 bluebird.js,bluebird 对 ES6 原生 Promise 进行封装,解决了浏览器兼容性问题;
es6-promise 使用 es6-promise 也可以解决 IE 下不支持 Promise 的问题;
5、Promise详解
- Promise 能够通过 new 进行对象创建,说明它是一个类或或构造函数;
- 使用 Promise 时,需要传入一个 executor 执行器;
- executor 执行器的入参包含 reslove 和 reject 两个函数;
(1)promise三种状态
- pending:等待态(默认)
let promise = new Promise(()=>{
  console.log('执行promise')
})
console.log('promise的状态', promise)
// 执行结果:
执行promise
promise的状态 Promise { <pending> }
- fulfilled:成功态
let promise = new Promise((resolve, reject)=>{
  console.log('执行promise')
  resolve("成功");	// 调用 resolve 方法
})
console.log('promise的状态', promise)
// 执行结果:
执行promise
promise的状态 Promise { '成功' }
- rejected:失败态;
let promise = new Promise((resolve, reject)=>{
  console.log('执行promise')
  reject("失败");	// 调用 reject 方法
})
console.log('promise的状态', promise)
// 执行结果:
执行promise
promise的状态 Promise { <rejected> '失败' }
- Promise实例的状态只能改变一次
promise 状态只能从 pending 更新为 fulfilled 成功态,或是从 pending 更新为 rejected 失败态; 当 promise 为成功或失败状态时,不能再次通过调用 resolve、reject或抛出异常来改变 当前 promise实例的状态;
(2)Promise.prototype.then()
- 每个 Promise 实例都有一个 then 方法;
- 通过调用 resolve 使状态更新为onFulfilled,进入 then 成功回调处理;
- 通过调用 reject 使状态更新为onRejected,进入 then 失败回调处理;
(3)Promise.prototype.catch()
- Promise.prototype.catch()方法就是- .then(null, rejection)或- .then(undefined, rejection)的别名, 用于指定发生错误时的回调函数;
(4)Promise.prototype.finally()
- 无论链式调用过程中是否出现成功或者失败,最终都将会执行 finally 方法