javascriptPromise如何使用_怎样优雅地处理异步操作【教程】
发布时间 - 2026-01-30 00:00:00 点击率:次Promise构造函数必须传入执行器函数,否则报错;then链中错误捕获遵循就近原则,推荐用.then().catch();async/await需用try/catch包裹await;并行选Promise.all(全成功)、allSettled(全返回)、race(首个settled)。
Promise 构造函数怎么写才不会报 undefined 或 executor is not a function
Promise 必须传入一个执行器函数(executor),它接收 resolve 和 reject 两个参数。常见错误是漏写函数、传了 null 或直接传值:
- ❌ 错误写法:
new Promise(null)、new Promise(123)、new Promise()(无参) - ✅ 正确写法:
new Promise((resolve,
reject) => { /* 异步逻辑 */ })
- ⚠️ 注意:executor 会立即同步执行,所以里面不能只放同步代码还期望“等一会再 resolve”——那只是普通函数调用,不是异步控制
then 和 catch 链式调用中,错误到底被谁捕获?
Promise 链的错误传递遵循就近原则,但容易误判位置。关键点在于:then 的第二个参数只捕获前一个 Promise 的 rejection,而 catch 会捕获链上前面所有未处理的 rejection。
- ❌
promise.then(success, fail)中的fail不会捕获success内抛出的错误 - ✅ 推荐写法:
promise.then(success).catch(fail)—— 这样success函数里throw或返回被 reject 的 Promise 都会被catch捕获 - ⚠️ 注意:
catch后如果没再抛错,后续then仍会执行(因为catch默认返回 fulfilled 状态)
用 async/await 替代 then 链时,try/catch 怎么配对才不漏错?
async/await 让异步像同步一样写,但错误处理必须显式用 try/catch,否则未捕获的 rejection 会变成 unhandled rejection。
- ✅ 必须把 await 表达式包在
try块里:try { const data = await fetch(...); } catch (err) { ... } - ⚠️
catch只捕获当前await的 rejection,多个 await 要共用一个try/catch才能统一处理,或各自独立处理 - ⚠️ 不要这样写:
const data = await fetch(...).catch(...)—— 这会让data变成undefined或错误对象,破坏类型预期
多个异步操作并行还是串行?Promise.all、Promise.allSettled、Promise.race 怎么选?
选错方法会导致逻辑异常或掩盖问题。核心区别不在“快慢”,而在“失败策略”和“返回结构”:
-
Promise.all:全部成功才 resolve,任一 reject 整体 reject —— 适合强依赖场景(如同时上传多个文件,缺一不可) -
Promise.allSettled:不管成败都等全部结束,返回每个结果的状态对象 —— 适合批量请求且需分别处理(如发 5 个 API,统计成功几个) -
Promise.race:谁先 settle(fulfill 或 reject)就用谁的结果 —— 常用于超时控制:Promise.race([fetch(), timeout(5000)]) - ⚠️ 注意:
Promise.all中某个 Promise 抛错后,其他仍在运行(不会自动取消),如需中断,得靠 AbortController 等机制配合
真正难的不是写对语法,而是判断哪个环节该 reject、哪个该 catch、哪个该吞掉、哪个该重试——这些没法靠 Promise 自动推断,得结合业务语义来设计。
# javascript
# java
# ai
# 区别
# NULL
# 构造函数
# try
# throw
# catch
# const
# undefined
# 对象
# promise
# 异步
# 多个
# 链式
# 会报
# 执行器
# 几个
# 而在
# 第二个
# 谁的
# 就用
# 报错
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何获取免费开源的自助建站系统源码?
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
如何在IIS管理器中快速创建并配置网站?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
简单实现Android验证码
千库网官网入口推荐 千库网设计创意平台入口
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
利用python获取某年中每个月的第一天和最后一天
Swift中循环语句中的转移语句 break 和 continue
Laravel如何使用Collections进行数据处理?(实用方法示例)
晋江文学城电脑版官网 晋江文学城网页版直接进入
如何用VPS主机快速搭建个人网站?
活动邀请函制作网站有哪些,活动邀请函文案?
Python3.6正式版新特性预览
如何快速选择适合个人网站的云服务器配置?
Laravel如何实现数据库事务?(DB Facade示例)
bootstrap日历插件datetimepicker使用方法
Laravel怎么使用artisan命令缓存配置和视图
在centOS 7安装mysql 5.7的详细教程
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
网站图片在线制作软件,怎么在图片上做链接?
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
EditPlus中的正则表达式实战(6)
iOS正则表达式验证手机号、邮箱、身份证号等
微信小程序制作网站有哪些,微信小程序需要做网站吗?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
javascript基本数据类型及类型检测常用方法小结
Laravel如何为API编写文档_Laravel API文档生成与维护方法
如何在云主机上快速搭建多站点网站?
JS弹性运动实现方法分析
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
java ZXing生成二维码及条码实例分享
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
青岛网站建设如何选择本地服务器?
打造顶配客厅影院,这份100寸电视推荐名单请查收


