什么是Promise以及如何在javascript中使用它?【教程】
发布时间 - 2026-01-30 00:00:00 点击率:次Promise 是为管理异步状态设计的对象,明确表达 pending/fulfilled/rejected 三种状态;构造函数执行器立即同步执行,resolve/reject 为微任务;链式处理需用 .catch() 统一捕获错误,避免 then 第二参数遗漏;async/await 是语法糖,await 后非 Promise 会自动包装;并发请求优先用 Promise.all 而非串行 await。
Promise 不是回调函数的语法糖,它是为解决异步操作状态管理而设计的对象 —— 用它不是为了“写得更酷”,而是为了能明确表达“等待中/成功/失败”这三种确定状态,并让链式处理变得可靠。
Promise 构造函数里必须传一个执行器函数
这个执行器函数会立即执行,且接收两个参数:resolve 和 reject,它们都是函数。你不能只调用其中一个,也不能漏掉错误分支:
-
resolve表示异步成功,触发.then()的第一个回调 -
reject表示异步失败,触发.catch()或.then()的第二个回调 - 如果执行器内部抛出未捕获异常(比如
throw new Error('xxx')),等价于调用reject
常见错误:在执行器里忘了调用 resolve 或 reject,导致 Promise 永远处于 pending 状态,后续链式调用卡住。
Promise.then() 接收两个可选函数,但别把错误处理全塞进第二个参数
.then(onFulfilled, onRejected) 的第二个参数只能捕获前一个 Promise 的拒绝(reject),无法捕获 onFulfilled 内部抛出的错误 —— 这点极易被忽略:
- 写成
promise.then(() => { throw new Error('oops') }, handleError),handleError不会执行 - 正确做法是统一用
.catch(),它能捕获链中任意环节的拒绝(包括then回调里的异常) - 多个
.then()串联时,每个返回值自动包装成新 Promise;返回普通值 → 下个then收到该值;返回 Promise → 下个then等它 settle 后再执行
async/await 是 Promise 的语法封装,不是替代品
async 函数本质就是返回 Promise 的函数,await 只是暂停当前 async 函数执行、等待 Promise settle 的语法糖:
-
await后面如果不是 Promise,会自动用Promise.resolve()包装 -
await遇到 rejected Promise 会直接抛出错误,需要用try/catch捕获,而不是靠.catch() - 不要在循环里盲目
await多个请求 —— 如果无依赖关系,用Promise.all([p1, p2, p3])并发更高效
典型陷阱:在 for...of 中对数组逐个 await fetch(url),实际变成串行请求,耗时翻倍。
Promise.race() 和 Promise.all() 的行为差异直接影响错误策略
这两个静态方法常

-
Promise.race([p1, p2]):谁先 settle(无论 fulfilled 还是 rejected),就以它的结果为准;若最先 settle 的是 reject,整个 race 就 rejected —— 即使其他 Promise 其实成功了 -
Promise.all([p1, p2]):全部 fulfilled 才 resolve;只要有一个 rejected,立刻 reject(不等其余);想“全部执行完不管成败”,得用Promise.allSettled() - 超时控制常用
Promise.race([apiCall, timeoutPromise]),但要注意 timeoutPromise 必须是真正 reject 的 Promise,否则 race 不会切换状态
最易被忽略的一点:Promise 构造函数里的执行器是同步执行的,但它的 resolve/reject 回调是微任务,总在当前宏任务结束后、下次宏任务开始前运行 —— 这决定了它和 setTimeout 的执行顺序。
# javascript
# java
# 回调函数
# ai
# 区别
# 并发请求
# for
# 封装
# 构造函数
# try
# throw
# catch
# Error
# 循环
# 并发
# 对象
# promise
# 异步
# 链式
# 回调
# 执行器
# 第二个
# 抛出
# 多个
# 下个
# 的是
# 都是
# 第一个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
详解Android——蓝牙技术 带你实现终端间数据传输
Python3.6正式版新特性预览
JavaScript如何实现音频处理_Web Audio API如何工作?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
南京网站制作费用,南京远驱官方网站?
如何确保西部建站助手FTP传输的安全性?
Python文件异常处理策略_健壮性说明【指导】
中山网站制作网页,中山新生登记系统登记流程?
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
如何快速搭建二级域名独立网站?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何获取上海专业网站定制建站电话?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
Laravel如何使用Collections进行数据处理?(实用方法示例)
Laravel如何使用Eloquent进行子查询
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
Android仿QQ列表左滑删除操作
微信小程序 HTTPS报错整理常见问题及解决方案
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
清除minerd进程的简单方法
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
如何在阿里云香港服务器快速搭建网站?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
,交易猫的商品怎么发布到网站上去?
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何登录建站主机?访问步骤全解析
Android利用动画实现背景逐渐变暗
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Python并发异常传播_错误处理解析【教程】
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何快速生成凡客建站的专业级图册?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
使用Dockerfile构建java web环境
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
奇安信“盘古石”团队突破 iOS 26.1 提权
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案

