什么是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 构造函数里必须传一个执行器函数

这个执行器函数会立即执行,且接收两个参数:resolvereject,它们都是函数。你不能只调用其中一个,也不能漏掉错误分支:

  • resolve 表示异步成功,触发 .then() 的第一个回调
  • reject 表示异步失败,触发 .catch().then() 的第二个回调
  • 如果执行器内部抛出未捕获异常(比如 throw new Error('xxx')),等价于调用 reject

常见错误:在执行器里忘了调用 resolvereject,导致 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智能防护方案