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

news/2024/9/23 9:25:24/

文章目录

  • 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() 关联的进一步处理程序。最终的兑现值或拒绝原因在调用时作为输入参数传给兑现和拒绝处理程序。

http://www.ppmy.cn/news/1356743.html

相关文章

【大数据面试题】007 谈一谈 Flink 背压

一步一个脚印,一天一道面试题(有些难点的面试题不一定每天都能发,但每天都会写) 什么是背压 Backpressure 在流式处理框架中,如果下游的处理速度,比上游的输入数据小,就会导致程序处理慢&…

opencv安装介绍以及基本图像处理详解

文章目录 一、什么是OpenCV ?二. OpenCV 安装1. 下载地址2.安装命令:pip install opencv-python 三、图像基础1. 基本概念2. 坐标系3. 基本操作(彩色图片)(1)读取图片:cv2.imread( )&#xff08…

vue中使用jsx语法

请注意,在 Vue 中使用 JSX 时,你仍然需要通过 h 函数(通常是一个别名,对应于 createElement 函数)来创建虚拟 DOM 元素。在下面的例子中,h 函数作为 render 函数的参数传入,但在 JSX 语法中你通…

【PyQt】12-滑块、计数控件

文章目录 前言一、滑块控件 QSlider运行结果 二、计数器控件 QSpinBox运行结果 总结 前言 1、滑块控件 2、计数控件 一、滑块控件 QSlider #Author :susocool #Creattime:2024/2/15 #FileName:28-滑块控件 #Description: 通过滑块选择字体大小 import sys from PyQ…

mysql删除idb文件,或者idb文件损坏后的修复

由于使用docker磁盘已满,导致建立表过程中,数据的插入存在问题,进而导致后续启动时读取该表的idb存在问题,导致无法启动 现在提供一种思路处理该种情况 innodb_force_recovery 选项可以让你在某些类型的错误发生时仍然启动 MySQL。…

浅谈Vue组件之间的通信

Vue组件之间的通信可以通过多种方式进行&#xff0c;以下是一些常用的方法&#xff1a; 父子组件通信&#xff1a; 父组件向子组件传递数据&#xff1a;可以通过props属性向子组件传递数据。 vue<template><child-component :someProp"parentData"></…

Leetcoder Day15| 二叉树 part04

语言&#xff1a;Java/C 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 输入&#xff1a;root [3,9,20,null,null,15,…

Uniapp-开发小程序

文章目录 前言一、npm run xxx —— cross-env: Permission denied解决方法&#xff08;亲测有效&#xff09;其他解决方法&#xff1a; 二、macOS 微信开发者工具选择uniapp 用 vscode 开发 总结 前言 macOS下 uniapp 开发小程序。 一、npm run xxx —— cross-env: Permissi…