ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Promise学习之路(一):Promise() 构造函数

Promise学习之路(一):Promise() 构造函数

文章目录

  • 1 Promise() 语法
  • 2 Promise() 的参数
  • 3 Promise() 的返回值
  • 4 Promise() 的使用时机
  • 5 Promise 流程概述

Promise() 构造函数可创建 Promise 对象,主要用于封装尚未支持 Promise 的基于回调的 API。

1 Promise() 语法

Promise() 构造函数接收一个函数类型的参数executor,我们称executor为执行器函数。语法如下

new Promise(executor)

具体的 👇

new Promise( function(resolve, reject) {...} /* executor */  );

executor 函数也可以使用箭头函数来声明 👇

new Promise( (resolve, reject) => {...} /* executor */  );

注意: Promise() 只能通过 new 运算符来构造。如果尝试在没有使用 new 的情况下调用它,会抛出 TypeError 异常。

2 Promise() 的参数

executor 函数在 Promise 构造函数中是作为一个参数被传入,并在 Promise 对象被创建后立即执行。

executor 函数带有 resolvereject 两个函数类型的参数 。当调用任意一个参数时,会改变 Promise 对象的状态。具体来说,

  • 异步操作成功时,调用 resolve 函数, Promise 对象的状态就会由 pending 变为 fulfilled(已兑现),并返回 executor 函数中 resolve 的参数(成功的值)。
  • 异步操作失败时,调用 reject 函数, Promise 对象的状态就会由 pending 变为rejected(已拒绝),并返回 executor 函数中 reject 的参数(失败的原因)。
  • executor 中抛出的任何错误都会导致 Promise 被拒绝,并且返回值将被忽略。

一旦 Promise 的状态从 pending 变为 fulfilled 或 rejected,就不会再改变。 也就是说,对与一个Promise而言,状态只能改变一次,要么从 pending →fulfilled ,要么从 pending →rejected

同时需要注意的是,resolvereject 函数是在 executor 函数内部被调用,而不是在 Promise 对象返回之后才执行。也就是说,当 Promise 构造函数返回一个新的 Promise 对象时,executor 函数已经被执行完毕了。

resolvereject 也是函数,你可以给它们任何实际的名称,比如(aa, bb) 👇

new Promise( (aa, bb) => {...} /* executor */  );

resolvereject 接受一个任意类型的参数。

resolve(value); // 解决时调用
reject(reason); // 拒绝时调用

3 Promise() 的返回值

当通过 new 关键字调用 Promise 构造函数时,它会返回一个 Promise 对象。

4 Promise() 的使用时机

如果你的任务已经基于 Promise 实现,你大概率不需要使用 Promise() 构造函数。

5 Promise 流程概述

  1. 在构造函数生成新的 Promise 对象时,它还会生成一对相应的 resolvereject 函数,它们与 Promise 对象 “绑定” 在一起。
  2. executor 通常会封装某些提供基于回调的 API 的异步操作。回调函数(传给原始回调 API 的函数)在 executor 代码中定义,因此它可以访问 resolve 和 reject。
  3. executor 是同步调用的(在构造 Promise 时立即调用),并将 resolve 和 reject 函数作为传入参数。
  4. executor 中的代码有机会执行某些操作。异步任务的最终完成通过 resolve 或 reject 引起的副作用与 Promise 实例进行通信。这个副作用让 Promise 对象变为“已解决”状态。
    • 如果先调用 resolve,则传入的值将解决。Promise 可能会保持待定状态(如果传入了另一个 thenable 对象),变为已兑现状态(在传入非 thenable 值的大多数情况下),或者变为已拒绝状态(在解析值无效的情况下)。
    • 如果先调用 reject,则 Promise 立即变为已拒绝状态。
    • 一旦 resolve 或 reject 中的一个被调用,Promise 将保持解决状态。只有第一次调用 resolve 或 reject 会影响 Promise 的最终状态,随后对任一函数的调用都不能更改兑现值或拒绝原因,也不能将其最终状态从“已兑现”转换为“已拒绝”或相反。
    • 如果 executor 抛出错误,则 Promise 被拒绝。但是,如果 resolve 或 reject 中的一个已经被调用(即 Promise 已经被解决),则忽略该错误。
    • 解决 Promise 不一定会导致 Promise 变为已兑现或已拒绝(即已敲定)。Promise 可能仍处于待定状态,因为它可能是用另一个 thenable 对象解决的,但它的最终状态将与已解决的 thenable 对象一致。
  5. 一旦 Promise 敲定,它会(异步地)调用任何通过 then()、catch() 或 finally() 关联的进一步处理程序。最终的兑现值或拒绝原因在调用时作为输入参数传给兑现和拒绝处理程序。
返回列表