17
Jul

Promise笔记

avatar
ByKK
2021-07-17/3 Min Read
0
0
(AI总结) 这份笔记旨在系统性梳理 JavaScript 中的 Promise 对象。内容从 Promise 的基本定义和特性出发,详细介绍了其三种状态(pending、fulfilled、rejected)以及状态一旦改变不可逆的特点。笔记接着阐述了 Promise 的常用方法,包括 Promise.resolve()、Promise.reject()、Promise.all() 和 Promise.race(),并解释了它们各自的参数和用途。此外,笔记还通过代码示例展示了如何中断 Promise 链,并提供了手写实现 Promise 构造函数、then、catch、resolve、all 和 race 等核心功能的代码。最后,内容延伸至 async 函数和 await 表达式,解释了它们的基本用法和注意事项,以帮助理解现代 JavaScript 中的异步流程控制。

1、介绍

Promise是异步编程的一种解决方案,比回调函数和事件更合理且更强大。可以理解为一个容器,里面保存着某个未来才会结束的事件的结果。

2、特点

  • Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败),该状态不受外界影响。
  • 状态可以从pending变为fulfilled,或者从pending变为rejected。一旦状态改变,就不会再变。

3、Promise的状态

  • peeding 未决定的

  • resolved / fulfilled 成功

  • rejected 失败

4、Promise的方法

  • Promise.resolve()

  • Promise.reject()

  • Promise.all()

​ 参数:传入多个Promise的数组。

​ 说明:返回一个新的Promise,只有所有的Promise都成功了才成功,如果有一个失败了就直接失败。

  • Promise.race()

​ 参数:传入多个Promise的数组。

​ 说明:返回一个新的Promise,第一个完成的Promise的结果就是最终的结果。

5、中断Promise链

let p = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('ok')
  }, 1000)
})
p.then(value => {
  console.log('111')
  // 有且只有一个方法
  return new Promise(() => {})
})
  .then(value => {
    console.log('222')
  })
  .then(value => {
    console.log('333')
  })

6、手写Promise函数

class Promise {
  // 构造方法
  constructor(executor) {
    // 添加属性
    this.PromiseState = 'pending'
    this.PromiseResult = null
    // 声明回调函数
    this.callback = []
    // 保存实例对象的 this 的值
    const self = this
    // resolve 函数
    function resolve(data) {
      // 增加判断
      if (self.PromiseState !== 'pending') return
      // 1、修改对象的状态(promiseState)
      self.PromiseState = 'fulfilled'
      // 2、设置对象的结果值(promiseResult)
      self.PromiseResult = data
      // 调用成功的回调函数
      setTimeout(() => {
        self.callback.forEach(item => {
          item.onResolved(data)
        })
      })
    }
 
    // reject 函数
    function reject(data) {
      // 增加判断
      if (self.PromiseState !== 'pending') return
      // 1、修改对象的状态(promiseState)
      self.PromiseState = 'rejected'
      // 2、设置对象的结果值(promiseResult)
      self.PromiseResult = data
      // 调用失败的回调函数
      setTimeout(() => {
        self.callback.forEach(item => {
          item.onRejected(data)
        })
      })
    }
 
    try {
      // 同步调用【执行器函数】
      executor(resolve, reject)
    } catch (e) {
      // 修改 Promise 对象状态为【失败】
      reject(e)
    }
  }
 
  // 添加 then 方法
  then(onResolved, onRejected) {
    const self = this
    // 判断回调函数参数
    if (typeof onRejected !== 'function') {
      onRejected = reason => {
        throw reason
      }
    }
    if (typeof onResolved !== 'function') {
      onResolved = value => value
    }
    return new Promise((resolve, reject) => {
      // 封装函数
      function callback(type) {
        try {
          const result = type(self.PromiseResult)
          if (result instanceof Promise) {
            result.then(
              v => {
                resolve(v)
              },
              r => {
                reject(r)
              }
            )
          } else {
            resolve(result)
          }
        } catch (e) {
          reject(e)
        }
      }
      // 调用回调函数
      if (this.PromiseState === 'fulfilled') {
        setTimeout(() => {
          callback(onResolved)
        })
      }
      if (this.PromiseState === 'rejected') {
        setTimeout(() => {
          callback(onRejected)
        })
      }
      // 判断 pending 状态
      if (this.PromiseState === 'pending') {
        // 保存回调函数
        this.callback.push({
          onResolved: function () {
            callback(onResolved)
          },
          onRejected: function () {
            callback(onRejected)
          }
        })
      }
    })
  }
 
  // 添加 catch 方法
  catch(onRejected) {
    return this.then(undefined, onRejected)
  }
 
  // 添加 resolve 方法
  static resolve(value) {
    return new Promise((resolve, reject) => {
      if (value instanceof Promise) {
        value.then(
          v => {
            resolve(v)
          },
          r => {
            reject(r)
          }
        )
      } else {
        resolve(value)
      }
    })
  }
 
  // 添加 all 方法
  static all(promises) {
    return new Promise((resolve, reject) => {
      let count = 0
      const arr = []
      // 遍历
      for (let index = 0; index < promises.length; index++) {
        const element = promises[index]
        element.then(
          v => {
            // 得知状态是成功的
            // n个promise成功才能调用
            count++
            // 将结果存储
            arr[index] = v
            if (count === promises.length) resolve(arr)
          },
          r => {
            reject(r)
          }
        )
      }
    })
  }
 
  // 添加 race 方法
  static race(promises) {
    return new Promise((resolve, reject) => {
      for (let index = 0; index < promises.length; index++) {
        const element = promises[index]
        element.then(
          v => {
            resolve(v)
          },
          r => {
            reject(r)
          }
        )
      }
    })
  }
}

7、async和await

  • async 函数

    1. 函数的返回值为 Promise 对象。
    2. Promise 对象的结果由 async 函数执行的返回值决定。
  • await 表达式

    1. await 右侧的表达式一般为 Promise 对象,但也可以是其他的值。
    2. 如果表达式是 Promise 对象,await返回的是 Promise 成功的值。
    3. 如果表达式是其他值,直接将此值作为 await 的返回结果。
  • 注意

    1. await 必须写在 async 函数中,但 async 函数中可以没有await。
    2. 若果 await 的 Promise 失败了,就会抛出异常,需要通过 try...catch 捕获处理。