ES6 Promise 状态机

news2026/2/19 14:11:30

状态机:抽象的计算模型,根据特定的条件或者信号切换不同的状态

一、Promise 是什么?

简单来说,Promise 就是一个“承诺对象”。在ES6 里,有些代码执行起来需要点时间,比如加载文件、等待网络请求或者设置定时器,这些代码被叫做“生产代码”;而另外一些代码得等着生产代码出结果才能执行,这就是“消费代码”。Promise 就像一座桥,把生产代码和消费代码连接起来。

它本身包含了生产代码,还会调用消费代码。Promise 有三种状态:

  • pending(进行中):就像任务还在执行中,结果还没出来。
  • fulfilled(已完成):任务成功完成,有了一个结果值。
  • rejected(已拒绝):任务出错了,得到一个错误对象。

不过呢,咱们不能直接去访问 Promise 的状态(state)和结果(result),得通过它的方法来处理。

二、Promise 怎么用?

(一)基本语法

创建一个 Promise 得用 new Promise(),里面传一个函数,这个函数有两个参数,myResolvemyReject

let promise = new Promise(function(resolve, reject) {
    // 生产代码
    if (/* 条件满足,任务成功 */) {
        resolve("成功啦!"); // 成功时调用
    } else {
        reject("出错咯!"); // 失败时调用
    }
});

(二)处理结果

.then() 来处理 Promise 的结果,它可以接收两个函数:

  • 第一个函数是任务成功时执行的。
  • 第二个函数是任务失败时执行的。这两个函数都是可选的,你可以只写成功的或者只写失败的处理函数。
promise.then(
    function(value) { /* 成功了咋处理 */ },
    function(error) { /* 失败了咋处理 */ }
);

(三)举个栗子

比如,我们用 Promise 来模拟一个 3 秒后的定时器:

function showMessage(some) {
    document.getElementById("demo").innerHTML = some;
}

let promise = new Promise(function(resolve, reject) {
    let x = 0;
    if (x == 0) {
        resolve("OK"); // x 等于 0,任务成功
    } else {
        reject("Error"); // x 不等于 0,任务失败
    }
});

promise.then(
    function(value) { showMessage(value); }, // 成功时显示 "OK"
    function(error) { showMessage(error); } // 失败时显示 "Error"
);

再比如,用 Promise 来处理文件请求:

let promise = new Promise(function(resolve, reject) {
    let req = new XMLHttpRequest();
    req.open('GET', "xxx.html");
    req.onload = function() {
        if (req.status == 200) {
            resolve(req.response); // 请求成功,返回文件内容
        } else {
            reject("File not Found"); // 请求失败,返回错误信息
        }
    };
    req.send();
});

promise.then(
    function(value) { showMessage(value); }, // 成功时显示文件内容
    function(error) { showMessage(error); } // 失败时显示错误信息
);

三、什么时候该用 Promise?

当你遇到以下情况时,就可以考虑用 Promise 啦:

  • 需要处理异步操作:像定时器 setTimeout、网络请求(AJAX)、文件读取这些操作,都是异步的,不会阻塞代码执行,这时候用 Promise 能让代码更清晰。
  • 避免回调地狱:如果有多个异步操作需要按顺序执行,用传统的回调函数可能会写成嵌套的形式,代码看起来像个“地狱”,而 Promise 可以通过链式调用让代码更有条理。
  • 统一处理成功和失败:不管异步操作是成功还是失败,都可以通过 .then() 或者 .catch() 来统一处理结果,让代码更简洁。

四、Promise 原理是

Promise 的核心原理其实就是状态机:

  1. 一开始,Promise 处于 pending 状态,这时候生产代码在执行。
  2. 当生产代码执行成功,就会调用 myResolve(),Promise 状态变成 fulfilled,然后执行 .then() 里的成功回调函数。
  3. 要是生产代码执行出错,就会调用 myReject(),Promise 状态变成 rejected,接着执行 .then() 里的失败回调函数。

而且,Promise 的状态一旦改变,就不会再变了。也就是说,一旦变成 fulfilled 或者 rejected,就定格在这个状态了,这样可以避免重复处理结果。

Promise 是 ES6(ECMAScript 2015)引入的特性,现在主流的浏览器基本都支持,比如 Chrome 33 及以上、Firefox 29 及以上等等,所以不用担心兼容性问题,可以放心用起来啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

贪心算法应用:带权任务间隔调度问题详解

贪心算法应用:带权任务间隔调度问题详解 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。带权任务间隔调度问题是贪心算法的一个经典应用场景。 问题定义…

用电脑控制keysight示波器

KEYSIGHT示波器HD304MSO性能 亮点: 体验 200 MHz 至 1 GHz 的带宽和 4 个模拟通道。与 12 位 ADC 相比,使用 14 位模数转换器 (ADC) 将垂直分辨率提高四倍。使用 10.1 英寸电容式触摸屏轻松查看和分析您的信号。捕获 50 μVRMS …

LLaMA-Factory - 批量推理(inference)的脚本

scripts/vllm_infer.py 是 LLaMA-Factory 团队用于批量推理(inference)的脚本,基于 vLLM 引擎,支持高效的并行推理。它可以对一个数据集批量生成模型输出,并保存为 JSONL 文件,适合大规模评测和自动化测试。…

【Elasticsearch】Elasticsearch 核心技术(二):映射

Elasticsearch 核心技术(二):映射 1.什么是映射(Mapping)1.1 元字段(Meta-Fields)1.2 数据类型 vs 映射类型1.2.1 数据类型1.2.2 映射类型 2.实际运用案例案例 1:电商产品索引映射案…

【计算机网络】网络层协议

1. ICMP协议的介绍及应用 IP协议的助手 —— ICMP 协议 ping 是基于 ICMP 协议工作的,所以要明白 ping 的工作,首先我们先来熟悉 ICMP 协议。 ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。 里面有个关键词 …

结构型设计模式之Proxy(代理)

结构型设计模式之Proxy(代理) 前言: 代理模式,aop环绕通知,动态代理,静态代理 都是代理的一种,这次主要是记录设计模式的代理demo案例,详情请看其他笔记。 1)意图 为其…

案例分享--汽车制动卡钳DIC测量

制动系统是汽车的主要组成部分,是汽车的主要安全部件之一。随着车辆性能的不断提高,车速不断提升,对车辆的制动系统也随之提出了更高要求,因此了解车辆制动系统中每个部件的动态行为成为了制动系统优化的主要途径,同时…

Redis Set集合命令、内部编码及应用场景(详细)

文章目录 前言普通命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM 集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令小结内部编码使用场景 前言 集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中 1)元…

C++算法动态规划1

DP定义: 动态规划是分治思想的延申,通俗一点来说就是大事化小,小事化无的艺术。 在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。 动态规划具…

KaiwuDB在边缘计算领域的应用与优势

KaiwuDB 在边缘计算场景中主要应用于 工业物联网(IIoT)、智能电网、车联网 等领域,通过其分布式多模架构和轻量化设计,在边缘侧承担 数据实时处理、本地存储与协同分析 的核心作用。以下是具体案例和功能解析: 1. 典型…

鸿蒙开发List滑动每项标题切换悬停

鸿蒙开发List滑动每项标题切换悬停 鸿蒙List滑动每项标题切换悬停,功能也很常见 一、效果图: 二、思路: ListItemGroup({ header: this.itemHead(secondClassify, index) }) 三、关键代码: build() {Column() {List() {ListIt…

ubuntu开机自动挂载windows下的硬盘

我是ubuntu和windows的双系统开发,在ubuntu下如果想要访问windows的硬盘,需要手动点击硬盘进行挂载,这个硬盘我每次编译完都会使用,所以用下面的步骤简化操作,让系统每次开机后自动挂载。 第一步. 确定硬盘的设备标识…

使用 Golang `testing/quick` 包进行高效随机测试的实战指南

使用 Golang testing/quick 包进行高效随机测试的实战指南 Golang testing/quick 包概述testing/quick 包的功能和用途为什么选择 testing/quick 进行测试快速入门:基本用法导入 testing/quick 包基本使用示例:快速生成测试数据quick.Check 和 quick.Val…

32 C 语言字符处理函数详解:isalnum、isalpha、iscntrl、isprint、isgraph、ispunct、isspace

1 isalnum() 函数 1.1 函数原型 #include <ctype.h>int isalnum(int c); 1.2 功能说明 isalnum() 函数用于检查传入的整数参数是否为 ASCII 编码的字母或数字字符&#xff08;A - Z、a - z、0 - 9&#xff0c;对应 ASCII 值 65 - 90、97 - 122、48 - 57&#xff09;。…

Qt实现一个悬浮工具箱源码分享

一、效果展示 二、源码分享 hoverToolboxWidget.h #ifndef HOVERTOOLBOXWIDGET_H #define HOVERTOOLBOXWIDGET_H#include <QWidget> #include <QMouseEvent> #include <QPropertyAnimation> #include <QStyleOption> #include <QPainter>namespa…

线夹金具测温在线监测装置:电力设备安全运行的“隐形卫士”

在电网系统中&#xff0c;线夹金具是连接导线与输电塔架的关键部件&#xff0c;其运行状态直接影响电力传输的稳定性。传统人工巡检方式存在效率低、盲区多、数据滞后等问题&#xff0c;而线夹金具测温在线监测装置的普及&#xff0c;正为电力设备运维带来革新。 一、工作原理&…

《TCP/IP 详解 卷1:协议》第4章:地址解析协议

ARP 协议 地址解析协议&#xff08;ARP, Address Resolution Protocol&#xff09;是IPv4协议栈中一个关键的组成部分&#xff0c;用于在网络层的IP地址与数据链路层的硬件地址&#xff08;如MAC地址&#xff09;之间建立映射关系。它的主要任务是&#xff1a; 将32位的IPv4地…

Windows下运行Redis并设置为开机自启的服务

下载Redis-Windows 点击redis-windows-7.4.0下载链接下载Redis 解压之后得到如下文件 右键install_redis.cmd文件&#xff0c;选择在记事本中编辑。 将这里改为redis.windows.conf后保存&#xff0c;退出记事本&#xff0c;右键后选择以管理员身份运行。 在任务管理器中能够…

网络编程之网络基础

基础理论&#xff1a;IP、子网掩码、端口号、字节序、网络基础模型、传输协议 socket&#xff1a;TCP、UDP、广播、组播、抓包工具的使用、协议头、并发服务器 Modbus协议 、HTTP协议、HTML、 分析服务器 源码、数据库 一、认识网络 网络&#xff1a;实现多设备通信 二、IP地址…

Spring AI(11)——SSE传输的MCP服务端

WebMVC的服务器传输 支持SSE&#xff08;Server-Sent Events&#xff09; 基于 Spring MVC 的服务器传输和可选的STDIO运输 导入jar <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</a…