Promise 详解

1,145 阅读3分钟

Promise 对象

  • 参数是带有 resolve 和 reject 两个参数的函数,在 resolve 和 reject 函数被调用时分别将 promise 的状态改为 fulfilledrejected
  • 有三种状态:pending(进行中)fulfilled(已成功)rejected(已失败)

    • 只有异步操作的结果,可以决定当前是哪一种状态
    • 一旦状态改变,就不会再变
  • 缺点

    • 无法取消
    • promise 内部的错误不会反应到外部
    • 当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
  • promise.then()

    • 链式调用
    • 有两个参数 resolve 和 reject 该参数作为回调函数被调用;如果传入的 resolve 参数类型不是函数,则会在内部被替换为(x) => x ,即原样返回 promise 最终结果的函数
    • 回调函数中可传参数,如果想要在回调中获取上个 promise 中的结果,上个 promise 中必须要返回结果。
  • promise.catch()

    • then(null,reject)的缩写
    • 一般来说,不要在 then 方法里面定义 Reject 状态的回调函数(即 then 的第二个参数),总是使用 catch 方法。
    • Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个 catch 语句捕获。捕获之后还可以继续使用链式操作
    • Promise 内部的错误不会影响到 Promise 外部的代码
  • promise.all()

    • 参数为一个可迭代的对象
    • 在所有的 promise 都完成或有一个 promise 失败时异步地返回一个变为完成或失败状态的 promise
    • 返回值将会按照参数内的 promise 的顺序排列,而不是由调用 promise 的完成顺序决定
    • 当且仅当传入的可迭代对象为空时为同步
    • 如果参数中包含非 promise 值,会调用 Promise.resolve 方法,将参数转为 Promise 实例,再进一步处理。
    • 如果作为参数的 Promise 实例,自己定义了 catch 方法,那么它一旦被 rejected,并不会触发 Promise.all()的 catch 方法。
  • promise.race()

    • 参数为一个可迭代的对象
    • 一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝
    • 如果传的迭代是空的,则返回的 promise 将永远等待。
  • promise.resolve()

    • 可将现有对象转为 promise 对象

    • 参数分为四种情况

      • 参数为一个 promise 实例
      • 参数是一个 thenable 对象
      • 参数为一个 value 值(一个不具有 then 方法的对象),直接返回一个 resolve 状态的 promise
      • 参数为空,直接返回一个 resolve 状态的 promise
    • 立即 resolve 的 Promise 对象,是在本轮“事件循环”(event loop)的结束时,而不是在下一轮“事件循环”的开始时。

  • promise.reject()

    • Promise.reject()方法的参数,会原封不动地作为 reject 的理由,变成后续方法的参数。这一点与 Promise.resolve 方法不一致。
  • promise.finally()

    • Promise 在执行 then()和 catch()后,都会执行 finally 指定的回调函数。避免同样的语句需要在 then()和 catch()中各写一次的情况。
    • 不接受参数,因为无法知道 promise 的状态。因此 finally 方法里面的操作,应该与状态无关,不依赖 promise 的结果
  • promise.try()

    • 目前是提案状态
    • 应用场景:不知道或者不想区分,函数 f 是同步函数还是异步操作,但是想用 Promise 来处理它。因为这样就可以不管 f 是否包含异步操作,都用 then 方法指定下一步流程,用 catch 方法处理 f 抛出的错误。
  • 参考文档