当前位置: 首页 > news >正文

JavaScript 异步(Promise)

本文全面讲解 Promise创建、链式调用、组合、错误处理与常见陷阱是前端异步编程的核心标准。你是否想过如何表示一个暂时还不存在的值如何告别深层嵌套回调写出近乎同步写法的异步代码// 回调地狱 getUser(userId, function(user) { getPosts(user.id, function(posts) { getComments(posts[0].id, function(comments) { console.log(comments) }) }) }) // Promise 扁平写法 getUser(userId) .then(user getPosts(user.id)) .then(posts getComments(posts[0].id)) .then(comments console.log(comments))Promise是代表异步操作最终完成 / 失败的对象ES2015ES6标准化。你可以把它理解为餐厅取餐号—— 现在没食物但承诺做好后给你结果。本文你将学到Promise 是什么、为何诞生三种状态pending /fulfilled/rejected用构造函数创建 Promise使用.then()/.catch()/.finally()Promise 链式调用原理所有静态方法all /allSettled/race /any/resolve /reject/withResolvers /try常用模式与避坑指南前置知识回调函数Callback。一、什么是 PromisePromise 是一个代表异步操作最终结果的 JS 对象。它的含义我现在没有值但我保证之后给你结果或错误。// 1秒后决议的 Promise const promise new Promise((resolve, reject) { setTimeout(() { resolve(Hello from the future!) }, 1000) }) promise.then(value { console.log(value) // 1秒后输出 })与回调不同Promise 是返回的对象而非传入的函数。这让链式调用、组合、统一错误处理成为可能。二、餐厅取餐类比你下单 → 调用异步函数拿到取餐号 →得到 Promise 对象等待做菜 →pending进行中餐做好 →fulfilled成功食材用完 →rejected失败取餐 →.then()处理问题 →.catch()关键特性一旦落定settled状态永久不变。三、为什么需要 Promise回调的问题嵌套地狱金字塔代码错误处理分散、重复无法组合并行 / 串行流程同步 / 异步行为不一致Promise 提供扁平链式结构统一错误捕获强大的并发控制确定性异步行为四、Promise 三态与命运三种状态Statepending初始状态进行中fulfilled成功有结果值rejected失败有错误原因重要规则一旦从 pending → fulfilled /rejected状态永久锁定resolve()/reject()多次调用只生效第一次命运Fateresolved命运已锁定可能仍 pending但会跟随内部 Promiseunresolved未锁定五、Thenable 对象任何拥有.then()方法的对象都叫thenable。JS 会自动把它当作 Promise 兼容处理实现库间互操作。const thenable { then(onFulfilled) { onFulfilled(42) } } Promise.resolve(thenable).then(console.log) // 42六、创建 Promise1. 构造函数const p new Promise((resolve, reject) { // 同步立即执行 // 成功 → resolve(value) // 失败 → reject(error) })2. 包装回调式 APIfunction loadImage(url) { return new Promise((resolve, reject) { const img new Image() img.onload () resolve(img) img.onerror () reject(new Error(load failed)) img.src url }) }3. 快速创建Promise.resolve(值) Promise.reject(错误)七、消费 Promisethen /catch/finally1..then()核心方法接收成功回调返回新 Promise。2..catch()捕获链中任何错误等价于.then(undefined, err {})。3..finally()无论成功 / 失败都会执行用于清理关闭加载、释放资源。八、Promise 链式调用核心能力每一个.then()都返回新 Promise形成扁平流程。Promise.resolve(1) .then(x x 1) // 2 .then(x x 1) // 3 .then(console.log)规则返回普通值 → 作为下一个 then 的值返回 Promise → 等待它决议再继续抛出错误 → 进入最近 catch九、错误处理超级强大错误会自动穿透整条链直到被 catch一个 catch 捕获所有上游错误可 catch 后恢复流程getUser() .then(user getPosts(user.id)) .then(posts getComments(posts[0].id)) .catch(err console.error(任意一步出错:, err))十、Promise 静态方法必背1.Promise.all([])全部成功才成功任意失败立即失败短路并行执行等待全部2.Promise.allSettled([])永远不失败等待全部落定返回每个结果的状态与值3.Promise.race([])谁先落定谁赢成功失败都算结束常用于超时控制4.Promise.any([])谁先成功谁赢忽略失败全部失败才返回 AggregateError5.Promise.withResolvers()ES2024直接外部获取 resolve/reject更简洁。const { promise, resolve, reject } Promise.withResolvers()6.Promise.try()Baseline 2025统一处理同步 / 异步函数捕获同步抛出。十一、常用异步模式1. 串行执行依赖前序结果for...of await2. 并行执行互不依赖Promise.all3. 分批并行防限流slice 循环 Promise.all4. 重试机制循环 catch delay5. 回调转 PromisePromisify包装成 (resolve, reject) 形式十二、常见错误高频坑忘记 return→ 链断裂、undefined嵌套而非链式→ 重回回调地狱new Promise 包裹已有 Promise反模式没有 catch→ 未处理拒绝崩溃 / 警告forEach async→ 不等待直接继续微任务时序误解then 永远在同步代码之后十三、核心要点总结Promise 异步结果占位符三态pending → fulfilled /rejected一旦落定不可改变then 返回新 Promise → 支持链式错误自动穿透一个 catch 搞定并行 / 竞速 / 超时 / 重试都靠静态方法是 async/await 的基础概念 汇总一、核心基础Promise同类Future、Deferred、异步契约、Task异步占位值同类延迟计算、未来值Promise 状态pending/fulfilled/rejected同类异步生命周期、操作状态机落定settled同类决议、完成、结束二、语法与 APIthenable同类类 Promise 对象、鸭子类型Promise 链式调用同类流式调用、管道流程.then() / .catch() / .finally()同类回调处理器、完成钩子、清理函数三、静态组合方法Promise.all同类并行等待、全部成功、并发汇聚Promise.allSettled同类容忍失败并行、结果收集、批量状态Promise.race同类竞速、抢先完成、超时机制Promise.any同类优先成功、多源备选、最快可用Promise.withResolvers同类延迟决议、外部控制 PromisePromise.try同类统一同步异步、安全执行包裹四、模式与问题回调地狱同类嵌套金字塔、厄运金字塔Promise 构造反模式同类多余包装、冗余封装未处理 Promise 拒绝同类未捕获异常、崩溃隐患微任务时序同类事件循环、任务队列、宏任务 / 微任务五、上层抽象async/await同类Promise 语法糖、线性异步写法并行 / 串行 / 分批同类并发控制、任务调度、限流重试Retry同类容错、退避重试、故障自动恢复
http://www.gsyq.cn/news/1296831.html

相关文章:

  • 初创公司如何利用taotoken快速低成本验证多个大模型产品创意
  • 第4章 部署负载均衡 Keepalived + HAProxy
  • macOS外接显示器控制终极指南:轻松掌控亮度与音量的完整方案
  • 深度解析:如何通过MonitorControl实现macOS外接显示器硬件级控制
  • 三步完成Node.js应用在虚拟机内对接Taotoken多模型服务
  • 从“全量发布”到“小步快跑”:灰度发布的简单实践与学习路径
  • Claude终端集成工具:提升开发效率的AI命令行助手实现
  • 鸿蒙OpenHarmony特性配置:连接系统与硬件的核心裁剪技术
  • AI开发者如何快速接入多模型服务,五分钟搞定Python调用示例
  • GitHub Pages静态网站搭建:从Hugo生成器到自动化部署全流程
  • Mermaid Live Editor:免费实时图表编辑器终极指南,让技术绘图简单到令人惊叹
  • 常见 PE 启动盘
  • 5分钟解锁B站大会员4K视频下载!这个开源工具让你轻松收藏任何B站内容
  • 对比直接使用厂商API体验Taotoken在多模型路由与容灾上的优势
  • PromptOptimizer:基于熵优化的LLM提示词压缩技术深度解析
  • 物业临时工排班管理的技术破局:栎偲考勤神器的AI与离线方案详解
  • PoE Overlay 效率革命:3大核心模块让流放之路效率提升300%
  • 原神小助手:AI智能自动化,解放你的提瓦特冒险时间
  • Arm Neoverse CMN-650一致性网格网络架构与配置解析
  • 如何使用ubuntu搭建一个无盘PC启动服务器
  • 企业如何选择合适的智能客服系统?关键考量因素全解析 - 品牌2025
  • AI智能体开发脚手架:从零到一构建自主任务执行系统
  • 为什么MarkText能成为开发者最爱的Markdown编辑器?深度解析其技术架构与用户体验
  • AI助手越权了?南加州大学等揭示大模型代理的“权限失控“问题
  • 运算放大器增益带宽积(GBW)计算指南:从原理到选型实战
  • 基于CircuitPython与Feather RP2040的智能LED火箭氛围灯制作全攻略
  • Doramagic开源工具箱:开发者效率提升的模块化实践
  • 2026年成人纸尿裤经济型选购指南:3款主流高性价比产品深度解析与场景适配 - 产业观察网
  • 4个关键阶段:终极解决Windows Defender异常问题的完整指南
  • AI智能体操作Android应用:架构、实现与自动化测试新范式