Promise 一篇文章就够了

100 阅读3分钟

一.Promise

1 为什么需要promise

需求

通过ajax请求id,再根据id请求用户名;再根据用户名请求email

回调地狱

在回调函数中嵌套回调

Promise解决了回调地狱

2 Promise的基本使用

Promise是一个构造函数,通过new关键字实例化对象

语法

 new Promise((resolve, reject) => {})
  • Promise接受一个函数作为参数

  • 在参数函数中接受两个参数

    • resolve:
    • reject:

promise实例

promise实例有两个属性

  • state:状态
  • result:结果

1)promise的状态

第一种状态:pending(准备、待解决、进行中)

第二种状态:fulfilled(已完成、成功)

第三种状态:reject(已拒绝、失败)

2)promise状态的改变

通过调用 resolve() 和 reject() 改变当前promise对象的状态

示例

 const p = new Promise((resolve, reject) => {
     // resolve(): 调用函数,使得当前promise对象的状态改成fulfilled
     resolve()
 })
 console.dir(p) //fulfilled

示例

 const p = new Promise((resolve, reject) => {
     // resolve(): 调用函数,使得当前promise对象的状态改成fulfilled
     // reject(): 调用函数,使得当前promise对象的状态改成rejected
     // resolve()
     reject()
 })
 console.dir(p) //rejected
  • resolve(): 调用函数,使得当前promise对象的状态改成fulfilled
  • reject(): 调用函数,使得当前promise对象的状态改成rejected

promise状态的改变是一次性的

3)promise的结果

示例

 const p = new Promise((resolve, reject => {
     // 通过调用resolve, 传递参数,改变当前promise对象的结果
     resolve('成功的结果')
     // reject('失败的结果')
 })
 console.dir(p)

3 Promise的方法

1)then方法

示例

 const p = new Promise((resolve, reject) => {
     resolve('成功的结果')
     // reject('失败的结果')
 })
 ​
 // then 方法
 // 其接受两个参数
 // 1.是一个函数
 // 2.还是一个函数
 //返回值:是一个promise对象
 p.then((value) => {
     // 当promise的状态是fulfilled时,执行
     console.log('成功时调用', value)
 }, (season) => {
     // 当promise的状态是rejected时,执行
     console.log('失败时调用', season)
 })
 console.dir(p) // 成功的结果
  • 在 then 方法的参数函数中,通过形参使用 promise 对象的结果
  • then 的返回值是一个 promise 对象

示例

 const p = new Promise((resolve, reject) => {
     resolve('成功的结果')
 })
 ​
 // then 方法
 //返回值:是一个promise对象
 const t = p.then((value) => {
     console.log('成功时调用', value)
 }, (season) => {
     console.log('失败时调用', season)
 })
 console.dir(t)
 // 经过调试,新产生的 t 的状态应该为 pending
 //经调用 then 的第一个参数函数后,状态改变为fulfille,可以继续调用 t.then

由于 then 返回值是一个 promise 对象,所以可以继续调用 then方法,形成链式操作

  • new Promise((resolve, reject) => {}).then().then()

如果 p 内的执行体不调用参数函数,那么 then 调用哪个函数?

  • then 不执行参数参数,返回新的promise对象,其状态为pending

如何改变新promise对象的状态

  1. 第一个函数参数内使用return,promise对象的状态变为 fulfilled
  2. 第一个函数内出现代码错误,promise对象的状态变为 rejected

2)catch 方法:捕获错误

示例

 const p = new Promise((resolve, reject) => {
     reject('失败的结果')
 })
 // 什么情况下,catch 中的参数函数会执行
 // 1、当promise的状态为rejected时,会执行
 // 2、当promise执行体中的代码出现错误时
 p.catch(() => {
     console.log('失败')
 })
 ​

4 promise常见的写法

示例

 new Promise((resolve, reject) => {
     resolve()
 }).then((value) => {
   // 成功时执行  
    console.log('成功')
 }).catch((season) => {
     //失败时
     console.log('失败')
 })

\