1. 三种状态:pending、fulfilled、rejected
  2. promise中resolve()将状态改为fulfilled;reject()将状态改为rejected
  3. resolve()中传入不同的值有三种情况
  • 传入普通的值或对象,则直接作为onFulfilled方法返回值
  • promise对象,则状态和值由新promise对象决定
  • 实现了thenable方法的对象,会执行thenable方法,状态和值由thenable结果决定
  1. reject()中不管传入什么都作为onReject回调函数的返回值
  1. promise.prototype.then()
  • 两个回调函数作为参数
  • promise状态为fulfilled则调用第一个回调,rejected则调用第二个回调
  • then方法可以多次调用,当promise调用resolve()时,都会被调用
  • then方法也默认返回一个新的promise对象,返回规则如上
  1. promise.prototype.catch()
  • 捕捉promise中抛出的异常以及rejected状态
  • catch方法可以调用多次,当promise调用reject()回调时,都会被调用
  • catch方法也会返回一个新的promise对象,且状态是fulfilled
  1. promise.prototype.finally()
  • 不管promise对象是什么状态最后都会被调用

/ 传入单个promise对象 /

  1. Promise.resolve()
  • 相当于new Promise()中调用resolve()回调
  1. Promise.reject()
  • 相当于new Promise()中调用reject()回调

/ 传入多个promise对象以数组的形式[p1,p2,p3] /

  1. Promise.all()
  • 包裹了promise对象数组,当所有promise对象都为fulfilled状态时,则返回一个状态为fulfilled的promise对象,将所有promise对象的返回值形成一个数组
  • 当有一个状态为rejected时,新的promise对象状态为rejected,并且将第一个reject的返回值作为参数
  1. Promise.allSettled()
  • 当所有promise对象都有结果时,新的promise对象为fulfilled,结果为一个数组
  • 不管包裹的promise对象是什么状态,都会保留下来形成一个数组
  • 数组中包含所有promise对象的状态和值
  • 新promise对象状态一定为fulfilled
  1. Promise.race()
  • 哪个promise对象先执行完,新的promise对象状态就为它的状态,且将其返回值作为新的参数
  1. Promise.any()
  • 会等到至少有一个fulfilled状态,再决定新的promise
  • 如果都为rejected状态则会抛出一个错误,然后被catch捕捉

研究promise遇到的一些问题

  1. 为什么promise.then()里面的回调是放在微任务队列中呢?
  • 当Promise中是异步执行时,比如请求网络请求,当拿到请求到的返回值时,再调用resolve,通过promise.then()进行下一步操作。
  • 那么为了使拿到返回值后能立即对数据进行处理,就要将then中的回调函数放到微任务队列中,因为在宏任务队列执行之前要确保微任务队列已清空,那么就会立即执行微任务中的任务,进而处理刚获取到的数据
  1. 当Promise中是异步操作的时候,接下来的promise.then()中的两个回调会被放入到数组中,当Promise的状态被确认时,才会在微任务队列中去执行对应的回调。

  2. promise.reject()中放入什么参数都是直接将当前promise状态变为rejected,值为传入的参数值(传入promise也如此)

  3. promise.then()什么都不传的时候,promise.then() => 新的promise状态与原来promise状态保持一致,因为promise.then()中两个回调有默认值

  • onResolved = (value) => resolve(value)
  • onRejected = (reason)=>reject(reason)