javascriptPromise如何使用_怎样优雅地处理异步操作【教程】

发布时间 - 2026-01-30 00:00:00    点击率:
Promise构造函数必须传入执行器函数,否则报错;then链中错误捕获遵循就近原则,推荐用.then().catch();async/await需用try/catch包裹await;并行选Promise.all(全成功)、allSettled(全返回)、race(首个settled)。

Promise 构造函数怎么写才不会报 undefinedexecutor is not a function

Promise 必须传入一个执行器函数(executor),它接收 resolvereject 两个参数。常见错误是漏写函数、传了 null 或直接传值:

  • ❌ 错误写法:new Promise(null)new Promise(123)new Promise()(无参)
  • ✅ 正确写法:new Promise((resolve,

    reject) => { /* 异步逻辑 */ })
  • ⚠️ 注意:executor 会立即同步执行,所以里面不能只放同步代码还期望“等一会再 resolve”——那只是普通函数调用,不是异步控制

thencatch 链式调用中,错误到底被谁捕获?

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.allPromise.allSettledPromise.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寸电视推荐名单请查收