前言

JavaScript 正为 Promise 添加一个新的方法,使得处理异步函数更加清晰和安全。Promise.try 允许将任何函数包装在 Promise 中,无论它是否异步。

使用 Promise.try 可避免传统 try/catch 结构与 Promise 链的混合使用,代码更简洁。

try-catch的问题

try-catch 主要用于同步代码块,它可以捕获在 try 块中抛出的同步错误。

try {// 同步代码throw new Error("Sync error");} catch (e) {console.error(e.message); // 捕获到错误}

但对于在 try 块中调用了异步操作(如 setTimeout、Promise 等),那么异步操作中的错误不会被同一 try-catch 语句捕获,因为它们是在事件循环的下一个周期中执行的。

try/catch 实际上是多余的,因为异步操作中的错误不会被 try/catch 捕获。

function asyncFunction() {return new Promise((resolve,reject)=>{try{setTimeout(()=>{throw new Error(“Async error”);},1000)}catch(e){console.error(e.message)//捕获不到错误reject(e);}})}

这使得在处理异步操作时,我们不得不在每个可能抛出错误的地方都添加 try-catch 块,这不仅增加了代码的复杂度,而且容易导致错误的遗漏:

function asyncFunction() {return new Promise((resolve, reject) => {try {setTimeout(() => {try {throw new Error("Async error");} catch (e) {console.error('FedJavaScript', e.message); // 捕获到错误reject(e)}}, 1000);} catch (e) {console.error(e.message); // 不会捕获到错误reject(e);}});}

Promise.try解决方案

Promise.try 为我们提供了一种处理该情况的简洁方法:

示例:


Promise.try(() => {return maybeSyncOrAsyncOperation();
}).then(result => {console.log('结果:', result);
}).catch(error => {console.error('出错了:', error);
});

同步和异步解决方案

Promise.try(()=>{//同步代码throw new Error("sync error");}).catch(e=>{console.error(e.message);})Promise.try(()=>{//异步代码return new Promise((resolve, reject) => {setTimeout(() => {throw new Error("Async error");}, 1000);});}).catch(e=>{console.error(e.message);//捕获到错误})

主要功能

  1. 统一处理异常‌:无论函数是同步还是异步,Promise.try 都能自动捕获异常并返回错误信息。 ‌
  2. 支持参数传递‌:可接受多个参数,方便调用复杂函数。 ‌
  3. 语法简洁‌:使用 .then() 和 .catch() 链式处理结果和错误,代码更清晰。

使用场景

  1. 文件操作‌:如读取文件时捕获异常(如 JSON.parse(fs.readFileSync('./user.json')))。 ‌‌
  2. 网络请求‌:处理 HTTP 请求失败。 ‌‌
  3. 数据流处理‌:在数据解析或转换过程中捕获错误。 ‌‌


优点

  1. 简洁性:Promise.try 让我们可以直接在一个函数中处理同步操作,而无需额外的 new Promise 包装或 try...catch 块
  2. 一致性:无论是同步还是异步操作,使用相同的错误处理机制可以减少代码风格的不一致,使整个项目更加统一
  3. 易用性:对于初学者来说,理解 Promise.try 比学习如何正确地组合 new Promise 和 try...catch 更加直观

总结

Promise.try允许我们在使用 Promises 时以更一致的方式处理异步操作的错误。

Promise.try 可将任何函数(同步、异步或可能抛出异常的)包装为 Promise,自动捕获同步异常并转化为 Promise 状态。无需区分函数类型,统一处理异常逻辑,避免隐藏错误。

Promise.try 执行函数时不会强制转换为异步,同步函数会立即执行,异步函数则保持原有执行方式。

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

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

相关文章

MySQL-表的约束(上)

表的约束在 MySQL 中,表的约束(Constraints)用于确保数据库中数据的完整性和一致性。它们定义了对表中数据的规则和限制,防止无效或不一致的数据被插入、更新或删除。常见的 MySQL 表约束包括主键约束(PRIMARY KEY&…

Frida + FART 联手:解锁更强大的 Android 脱壳新姿势

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ Frida FART 联手能带来什么提升? 增强 FART 的脱壳能力:解决对抗 FART 的壳、动态加载的 dex 的 dump 和修复; 控制 FART…

TLS/SSL(传输层安全协议)

文章目录一、核心概念二、为什么需要 TLS/SSL?三、工作原理与详细流程握手步骤详解:1.ClientHello & ServerHello:2.服务器认证 (Certificate, ServerKeyExchange):3.客户端响应 (ClientKeyExchange, Finished):4.…

什么是 AWS 和 GCE ?

AWS 和 GCE 是两种不同厂商提供的云计算服务,主要区别在于提供商和产品定位。AWS全称:Amazon Web Services提供商:亚马逊 (Amazon)简介:全球最大的云计算平台之一,提供完整的云服务,包括: 计算&…

水电站电动机绝缘安全 “不掉线”!在线监测方案筑牢发电保障

对水电站而言,消防水泵、深井水泵等辅助电动机是安全运行的 “关键配角”—— 它们常年处于备用状态,又受潮湿环境影响,绝缘值降低易引发烧毁故障,而传统定期检测难以及时捕捉绝缘劣化趋势,一旦启动时出问题&#xff0…

【Datawhale之Happy-LLM】3种常见的decoder-only模型——Github最火大模型原理与实践教程task07

Task07:第三章 预训练语言模型PLM (这是笔者自己的学习记录,仅供参考,原始学习链接,愿 LLM 越来越好❤) 本篇介绍3种很典的decoder-only的PLM(GPT、LlaMA、GLM)。目前火&#x1f52…

【卷积神经网络】卷积神经网络的三大核心优势:稀疏交互、参数共享与等变表示

1. 引言 卷积神经网络(CNN)之所以在计算机视觉、语音识别等领域取得突破性进展,并非偶然。相比传统的全连接神经网络,CNN通过三个重要的思想来帮助改进机器学习系统:稀疏交互(sparse interactions)、参数共享(parameter sharing)、等变表示(equivariant representations)。…

网络共享协议

网络共享协议是用于在计算机网络中实现资源共享和数据传输的规则或标准。常见的共享协议包括文件共享、打印机共享、互联网连接共享等。SMB(Server Message Block 服务器消息块)SMB是一种网络共享协议,主要用于局域网中实现不同设备之间的文件…

MD5加密算法详解与实现

MD5加密算法详解与实现 什么是MD5加密? MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,可以产生一个128位(16字节)的哈希值,通常用32位的十六进制数表示。MD5由Ronald Rivest在…

(nice!!!)(LeetCode 每日一题) 3025. 人员站位的方案数 I (排序)

题目:3025. 人员站位的方案数 I 思路:排序,时间复杂度0(n^2)。 将数组points里的元素先按横坐标x升序排序,纵坐标y降序排序。第一层for循环枚举左上角的点,第二层for循环枚举右下角的点。细节看注释。 C版本&#xff…

可可图片编辑 HarmonyOS(4)图片裁剪

可可图片编辑 HarmonyOS(4)图片裁剪-canvas 前言 可可图片编辑 实现了图片的裁剪功能,效果如图所示。这里的核心技术是使用了canvas。 Canvas 入门 Canvas提供画布组件,用于自定义绘制图形,开发者使用CanvasRenderi…

怎么用PS制作1寸证件照(已解决)

方法/步骤一、按住键盘上的“Ctrl”“O”打开你要制作的照片二、点击裁剪工具 (调整为宽:2.5cm,高:3.5cm,分辨率:300像素),设置之后直接框选出需要剪切保留的位置(使人物居正中), 然后按上面的“√”,以便确认剪裁三、…

Qt libcurl的下载、配置及简单测试 (windows环境)

Qt libcurl的下载、配置及简单测试引言一、libcurl下载二、在Qt Creator中配置三、简单测试引言 curl(Client URL)是一个开源的命令行工具和库,用于传输数据支持多种协议(如HTTP、HTTPS、FTP、SFTP等)。其核心库libcur…

【Python语法基础学习笔记】竞赛常用标准库

前言此系列笔记是拨珠自己的学习笔记,自用为主,学习建议移步其他大佬的专门教程。math库Python 的 math 库是标准库之一,提供了大量数学运算相关的函数,适用于基础数学计算、科学计算等场景。下面详细介绍其使用方法及常用功能&am…

我的项目我做主:Focalboard+cpolar让团队协作摆脱平台依赖

文章目录前言1. 使用Docker本地部署Focalboard1.1 在Windows中安装 Docker1.2 使用Docker部署Focalboard2. 安装Cpolar内网穿透工具3. 实现公网访问Focalboard4. 固定Focalboard公网地址前言 “项目管理软件又涨价了!“小团队负责人小林发愁——刚习惯操作逻辑&…

【3D 入门-4】trimesh 极速上手之 3D Mesh 数据结构解析(Vertices / Faces)

【3D入门-指标篇上】3D 网格重建评估指标详解与通俗比喻【3D入门-指标篇下】 3D重建评估指标对比-附实现代码【3D 入门-3】常见 3D 格式对比,.glb / .obj / .stl / .ply Mesh 数据结构解析 1. Vertices(顶点) original_vertices mesh_ful…

无需服务器,免费、快捷的一键部署前端 vue React代码--PinMe

作为前端的开发,有时候想部署一个项目真的是很“受气”,要不就是找运维,或者后端,看别人的时间,或者走流程。 现在,有这么一个神器PinMe, 以前部署项目:自己买服务器?域名、 SSL、N…

【LeetCode_26】删除有序数组中的重复项

刷爆LeetCode系列LeetCode26题:github地址前言题目描述题目与思路分析代码实现算法代码优化LeetCode26题: github地址 有梦想的电信狗 前言 本文介绍用C实现leetCode第26题题目链接:https://leetcode-cn.com/problems/remove-duplicates-…

CMake构建学习笔记23-SQLite库的构建

1. 构建思路 在前文中构建了大量的库包程序(参看CMake构建学习笔记-目录)之后,可以总结一下在Windows下使用脚本构建程序的办法: 使用CMake构建。这是目前最通用最流行的构建方式,大部分C/C程序都在逐渐向这个方向转…

Watt Toolkit下载安装并加速GitHub

一、下载 官方地址:(Steam++官网) - Watt Toolkit Gitee下载地址:https://gitee.com/rmbgame/SteamTools/releases/tag/3.0.0-rc.16