ES6从入门到精通:Promise与异步

Promise 基础概念

Promise 是 JavaScript 中处理异步操作的一种对象,代表一个异步操作的最终完成或失败及其结果值。它有三种状态:Pending(进行中)、Fulfilled(已成功)、Rejected(已失败)。

创建 Promise 的语法如下:

const promise = new Promise((resolve, reject) => {// 异步操作if (/* 成功 */) {resolve(value);} else {reject(error);}
});

Promise 链式调用

Promise 可以通过 .then().catch() 方法链式调用,处理异步操作的成功或失败结果。

promise.then(value => {// 处理成功结果return anotherValue;}).then(newValue => {// 继续处理}).catch(error => {// 处理错误});

Promise 静态方法

ES6 提供了一些静态方法简化异步操作的处理:

Promise.all()
等待所有 Promise 完成,或其中一个失败:

Promise.all([promise1, promise2]).then(values => console.log(values)).catch(error => console.error(error));

Promise.race()
返回第一个完成(成功或失败)的 Promise:

Promise.race([promise1, promise2]).then(value => console.log(value)).catch(error => console.error(error));

Promise.resolve() 和 Promise.reject()
快速创建已解决或已拒绝的 Promise:

Promise.resolve('success').then(console.log);
Promise.reject('error').catch(console.error);

异步函数(Async/Await)

Async/Await 是 ES8 引入的语法糖,基于 Promise,简化异步代码的书写。

async 函数
声明一个异步函数,返回值会被自动包装为 Promise:

async function fetchData() {return 'data';
}

await 表达式
在 async 函数中等待 Promise 完成:

async function fetchData() {const response = await fetch('https://api.example.com');const data = await response.json();return data;
}

错误处理
使用 try/catch 捕获异步操作中的错误:

async function fetchData() {try {const response = await fetch('https://api.example.com');const data = await response.json();return data;} catch (error) {console.error('Fetch failed:', error);}
}

常见应用场景

AJAX 请求
使用 Promise 封装 XMLHttpRequest 或 Fetch API:

function fetchUser(id) {return new Promise((resolve, reject) => {fetch(`https://api.example.com/users/${id}`).then(response => response.json()).then(resolve).catch(reject);});
}

定时操作
用 Promise 封装 setTimeout:

function delay(ms) {return new Promise(resolve => setTimeout(resolve, ms));
}

注意事项

  • 避免 Promise 嵌套过深,尽量使用链式调用或 async/await。
  • 在 async 函数中,忘记使用 await 可能导致逻辑错误。
  • 使用 .catch()try/catch 处理错误,避免未捕获的 Promise 拒绝。

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

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

相关文章

数据结构:二维数组(2D Arrays)

目录 什么是二维数组? 二维数组的声明方式 方式 1:静态二维数组 方式 2:数组指针数组(数组中存放的是指针) 方式 3:双指针 二级堆分配 💡 补充建议 如何用“第一性原理”去推导出 C 中…

HAProxy 和 Nginx的区别

HAProxy 和 Nginx 都是优秀的负载均衡工具,但它们在设计目标、适用场景和功能特性上有显著区别。以下是两者的详细对比:1. 核心定位特性HAProxyNginx主要角色专业的负载均衡器/代理Web 服务器 反向代理/负载均衡设计初衷高性能流量分发高并发 HTTP 服务…

基于Java+SpringBoot的健身房管理系统

源码编号:S586源码名称:基于SpringBoot的健身房管理系统用户类型:多角色,用户、教练、管理员数据库表数量:13 张表主要技术:Java、Vue、ElementUl 、SpringBoot、Maven运行环境:Windows/Mac、JD…

【MySQL安装-yum/手动安装,卸载,问题排查处理完整文档(linux)】

一.使用Yum仓库自动安装 步骤1:添加MySQL Yum仓库 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm步骤2:安装MySQL服务器 sudo yum install mysql-server -y步骤3:启动并设置开机自启 sudo systemctl start mysqld sudo systemct…

自定义线程池-实现任务0丢失的处理策略

设计一个线程池,要求如下:队列最大容量为10(内存队列)。当队列满了之后,拒绝策略将新的任务写入数据库。从队列中取任务时,若该队列为空,能够从数据库中加载之前被拒绝的任务模拟数据库 (TaskDa…

【NLP入门系列四】评论文本分类入门案例

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 博主简介:努力学习的22级本科生一枚 🌟​;探索AI算法,C,go语言的世界;在迷茫中寻找光芒…

Ubuntu安装ClickHouse

注:本文章的ubuntu的版本为:ubuntu-20.04.6-live-server-amd64。 Ubuntu(在线版) 更新软件源 sudo apt-get update 安装apt-transport-https 允许apt工具通过https协议下载软件包。 sudo apt-get install apt-transport-htt…

C++26 下一代C++标准

C++26 将是继 C++23 之后的下一个 C++ 标准。这个新标准对 C++ 进行了重大改进,很可能像 C++98、C++11 或 C++20 那样具有划时代的意义。 一:C++标准回顾 C++ 已经有 40 多年的历史了。过去这些年里发生了什么?这里给出一个简化版的答案,直到即将到来的 C++26。 1. C++9…

【MySQL】十六,MySQL窗口函数

在 MySQL 8.0 及以后版本中,窗口函数(Window Functions)为数据分析和处理提供了强大的工具。窗口函数允许在查询结果集上执行计算,而不必使用子查询或连接,这使得某些类型的计算更加高效和简洁。 语法结构 function_…

微型气象仪在城市环境的应用

微型气象仪凭借其体积小、成本低、部署灵活、数据实时性强等特点,在城市环境中得到广泛应用,能够为城市规划、环境管理、公共安全、居民生活等领域提供精细化气象数据支持。一、核心应用场景1. 城市微气候监测与优化热岛效应研究场景:在城市不…

【仿muduo库实现并发服务器】eventloop模块

仿muduo库实现并发服务器一.eventloop模块1.成员变量std::thread::id _thread_id;//线程IDPoller _poll;int _event_fd;std::vector<Function<Function>> _task;TimerWheel _timer_wheel2.EventLoop构造3.针对eventfd的操作4.针对poller的操作5.针对threadID的操作…

Redis 加锁、解锁

Redis 加锁和解锁的应用 上代码 应用调用示例 RedisLockEntity lockEntityYlb RedisLockEntity.builder().lockKey(TradeConstants.HP_APP_AMOUNT_LOCK_PREFIX appUser.getAccount()).value(orderId).build();boolean isLockedYlb false;try {if (redisLock.tryLock(lockE…

在 Windows 上为 WSL 增加 root 账号密码并通过 Shell 工具连接

1. 为 WSL 设置 root 用户密码 在 Windows 上使用 WSL&#xff08;Windows Subsystem for Linux&#xff09;时&#xff0c;默认情况下并没有启用 root 账号的密码。为了通过 SSH 或其他工具以 root 身份连接到 WSL&#xff0c;我们需要为 root 用户设置密码。 设置 root 密码步…

2730、找到最长的半重复子字符穿

题目&#xff1a; 解答&#xff1a; 窗口为[left&#xff0c;right]&#xff0c;ans为窗口长度&#xff0c;same为子串长度&#xff0c;窗口满足题设条件&#xff0c;即只含一个连续重复字符&#xff0c;则更新ans&#xff0c;否则从左边开始一直弹出&#xff0c;直到满足条件…

MCP Java SDK源码分析

MCP Java SDK源码分析 一、引言 在当今人工智能飞速发展的时代&#xff0c;大型语言模型&#xff08;LLMs&#xff09;如GPT - 4、Claude等展现出了强大的语言理解和生成能力。然而&#xff0c;这些模型面临着一个核心限制&#xff0c;即无法直接访问外部世界的数据和工具。M…

[Linux]内核如何对信号进行捕捉

要理解Linux中内核如何对信号进行捕捉&#xff0c;我们需要很多前置知识的理解&#xff1a; 内核态和用户态的区别CPU指令集权限内核态和用户态之间的切换 由于文章的侧重点不同&#xff0c;上面这些知识我会在这篇文章尽量详细提及&#xff0c;更详细内容还得请大家查看这篇…

设计模式-观察者模式、命令模式

观察者模式Observer&#xff08;观察者&#xff09;—对象行为型模式定义&#xff1a;定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,在它的状态发生变化时,会通知所有的观察者.先将 Observer A B C 注册到 Observable &#xff0c;那么当 Observable 状态…

【Unity笔记01】基于单例模式的简单UI框架

单例模式的UIManagerusing System.Collections; using System.Collections.Generic; using UnityEngine;public class UIManager {private static UIManager _instance;public Dictionary<string, string> pathDict;public Dictionary<string, GameObject> prefab…

深入解析 OPC UA:工业自动化与物联网的关键技术

在当今快速发展的工业自动化和物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的无缝交换和集成变得至关重要。OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;作为一种开放的、跨平台的工业通信协议&#xff0c;正在成为这一领域的…

MCP 协议的未来发展趋势与学习路径

MCP 协议的未来发展趋势 6.1 MCP 技术演进与更新 MCP 协议正在快速发展&#xff0c;不断引入新的功能和改进。根据 2025 年 3 月 26 日发布的协议规范&#xff0c;MCP 的最新版本已经引入了多项重要更新&#xff1a; 1.HTTP Transport 正式转正&#xff1a;引入 Streamable …