Promise 的使用:状态、终值、拒绝原因、静态方法和实例方法

2022-03-31 15:31:52

Promise 是承诺,是新时代人民对美好生活的期待!

Promise A+ 是开发者制定的 JavaScript Promise 标准。

new Promise 美好生活的向往

Promisifying

将回调函数 Promise 化

(()=>new Promise(resolve=>setTimeout(()=>resolve('终值'))))().then(data=>console.log(data)) // 终值

状态

Promise 有三个状态:等待(Pending)完成(Fulfilled)拒绝(Rejected) 状态转换关系:

  1. 等待态 → 完成态,并提供终值

  2. 等待态 → 拒绝态,并提供拒绝原因

状态转换特点:

  1. 一次性,不可逆
  2. 报错 = 拒绝

静态方法

Promise.resolve()

如果入参是:

  1. Promise 实例:原样返回 Promise 对象
  2. 对象
    • then方法:返回等待态的 Promise 对象,立即执行 then 方法后,变完成态
    • 不带:返回完成态的 Promise 对象,将对象作为终值
  3. 空:返回完成态的 Promise 对象

Promise.reject()

入参作为拒绝原因

Promise.all()

入参为可迭代对象,包括数组、字符串、Set、Map

  1. 包含等待态的 Promise,返回等待态 Promise 对象
  2. 不包含,返回完成态 Promise 对象

终止条件

Promise.race()

入参同上

终止条件

场景

超时、测速

Promise.race([
  new Promise(resolve => setTimeout(resolve, 1, 'Timeout')), 
  fetch('/')
]).then(res => console.log(res)) // Timeout,1 毫秒会超时的 fetch 请求

Promise.allSettled()

入参同上

终止条件

原型方法

Promise.prototype.then()

  1. 本轮事件循环结束时触发
  2. 等待态不执行 then
  3. 链式调用,按添加顺序执行

Promise.prototype.catch()

等同于调用 Promise.prototype.then(undefined, onRejected),以下写法等价:

new Promise(()=>{
  throw new Error('error')
}).catch(e => console.log(e)) // error

new Promise(()=>{
  throw new Error('error')
}).then(undefined, e => console.log(e)) // error

new Promise((_, reject)=>{
  try {
    throw new Error('error')
  } catch (e) {
    reject(e)
  }
}).catch(e => console.log(e)) // error

new Promise((_, reject)=>{
  reject(new Error('error'))
}).then(undefined, e => console.log(e)) // error

错误处理

优先使用 Promise.prototype.catch 而不是 Promise.prototype.then(undefined, onRejected) 处理错误
拒绝或报错时,就近找后 thenreject 回调或 catch

new Promise((_, reject)=>{
  reject(new Error('error'))
}).then(() => console.log('no output'))
.catch(e => console.log(e)).catch(e => console.log('no output')) // error

Promise.prototype.finally()

无入参,Promise 实例转入完成态或拒绝态,都会执行