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

Javascript提高:JavaScript Promise 超通俗解释-由Deepseek产生

JavaScript Promise 超通俗解释

Promise是 JS 中专门用来处理异步操作的对象,它解决了传统回调函数的「回调地狱」问题,让异步代码(比如请求接口、读取文件、定时器)写起来像同步代码一样清晰、好维护。

简单说:Promise 就是一个“承诺”—— 异步操作现在没结果,但未来一定会给你一个结果(成功/失败)。


1. Promise 的三种状态

Promise 一生只有 3 种状态,状态一旦改变就固定,不可逆

  1. pending(等待中):初始状态,异步任务正在执行(比如接口还没返回、定时器还没到时间)
  2. fulfilled(已成功):异步任务执行成功,会返回结果
  3. rejected(已失败):异步任务执行失败,会返回错误

状态变化只有两种:

  • pending → fulfilled(成功)
  • pending → rejected(失败)

2. 基础语法:创建和使用 Promise

① 创建 Promise

new Promise()构造函数,里面包裹异步代码:

// 定义一个 Promise 函数functionwaitTime(time){// 返回 Promise 对象returnnewPromise((resolve,reject)=>{// 异步操作:定时器setTimeout(()=>{if(time>0){// ✅ 成功:调用 resolve,把结果传出去resolve(`等待了${time}毫秒,执行成功`);}else{// ❌ 失败:调用 reject,把错误传出去reject("时间不能小于等于0");}},time);});}
  • resolve:成功时调用,把状态改为fulfilled
  • reject:失败时调用,把状态改为rejected

② 使用 Promise

.then()接收成功结果,.catch()捕获错误,.finally()无论成功失败都会执行:

waitTime(2000).then((result)=>{// 成功回调:拿到 resolve 的数据console.log(result);// 输出:等待了 2000 毫秒,执行成功}).catch((error)=>{// 失败回调:拿到 reject 的错误console.error(error);}).finally(()=>{// 最终回调:无论成功/失败都执行(常用于关闭加载、清理操作)console.log("异步操作结束");});

3. 核心优势:解决回调地狱

传统异步嵌套(回调地狱,代码嵌套多层,可读性极差):

// 回调地狱 ❌setTimeout(()=>{console.log("第一步");setTimeout(()=>{console.log("第二步");setTimeout(()=>{console.log("第三步");},1000);},1000);},1000);

用 Promise 链式调用(扁平化,逻辑清晰):

// Promise 链式调用 ✅waitTime(1000).then(()=>{console.log("第一步");returnwaitTime(1000);// 返回新 Promise,继续链式}).then(()=>{console.log("第二步");returnwaitTime(1000);}).then(()=>{console.log("第三步");});

4. 进阶:async/await(Promise 语法糖)

ES7 推出的async/await是 Promise 的最简写法,让异步代码完全像同步代码:

// 用 async 标记函数是异步函数asyncfunctiondoTask(){try{// await 等待 Promise 完成,直接拿到结果constres1=awaitwaitTime(1000);console.log(res1);constres2=awaitwaitTime(1000);console.log(res2);}catch(error){// 统一捕获所有错误console.error(error);}}doTask();
  • await必须写在async函数里
  • await后面跟 Promise 对象,会暂停等待Promise 完成
  • try/catch捕获错误,替代.catch()

5. 常用 Promise 静态方法

Promise.all()

并行执行多个 Promise,全部成功才返回结果,一个失败就整体失败(常用于批量请求接口)

constp1=waitTime(1000);constp2=waitTime(2000);// 等待所有 Promise 完成Promise.all([p1,p2]).then((results)=>{console.log(results);// [结果1, 结果2]}).catch((err)=>{console.log("有一个失败了");});

Promise.race()

谁先完成(成功/失败)就返回谁的结果(常用于接口超时控制)

Promise.resolve()/Promise.reject()

快速创建一个成功/失败的 Promise。


总结

  1. Promise 是异步编程解决方案,解决回调地狱,让代码更优雅
  2. 三种状态:pendingfulfilled/rejected(状态不可逆)
  3. 核心方法:.then()成功、.catch()失败、.finally()最终
  4. 最简写法:async/await(Promise 语法糖)
  5. 常用工具:Promise.all()并行执行多个异步任务
http://www.cnnetsun.cn/news/1497654.html

相关文章:

  • 改进下垂控制的孤岛型并联分布式电源微电网系统
  • 建行江门市分行:银发关爱在行动 暖心服务送到家
  • 多策略改进的鲸鱼优化算法(MWOA),与其他三种变体和几种2024最新算法比较,策略都是很新颖的策略
  • 快速验证openclaw启动命令:用快马AI一键生成原型测试脚本
  • 告别‘unbox’失败:Truffle项目初始化保姆级教程,从MetaCoin到自定义合约
  • ESP32物联网设备上云第一步:在VSCode中用ESP-IDF搞定WiFi连接与HTTPS请求(含cJSON解析)
  • HunyuanVideo-Foley效果对比:不同prompt长度对Foley音效细节影响分析
  • 家里装了 OpenClaw,在公司也能随时管理——Shield CLI 远程访问方案
  • 线性代数实战:如何用Python快速判断矩阵能否相似对角化(附代码示例)
  • ESP32 IDF环境下DHT11温湿度读取避坑指南:从时序图到数据拼接的完整解析
  • 别再手动下载了!用Google Earth Engine (GEE) 5分钟批量处理Landsat C2L2数据的完整指南
  • 域组策略深度配置:RDP远程桌面安全加固与权限管理
  • 告别设备移除难题:USB-Disk-Ejector如何革新Windows设备管理体验
  • PyTorch GPU加速报错?3步搞定RuntimeError: No CUDA GPUs are available
  • 保姆级避坑指南:Mid-360雷达到手后,用livox_ros_driver2从接线到出点云的完整流程
  • Arduino库在mbed OS上的高性能移植与实时应用
  • 从Debian到openEuler:如何用alien无缝迁移你的软件包(实战教程)
  • 创5A难落地?巨有科技助力打通数字文旅管理全链路
  • 如何在3个步骤内完成Logisim-Evolution数字电路设计工具的安装配置
  • 无线测温系统的应用场景
  • 面试官问我MESI协议,我画了这张状态流转图给他讲明白了
  • 开源压枪系统:基于像素识别技术的后坐力补偿解决方案
  • PbootCMS开发者必看:从SQL注入漏洞看模板引擎的安全编码实践
  • Botty终极指南:暗黑破坏神2智能刷宝机器人的完整实战教程
  • 别再花钱买TTS服务了!手把手教你用Xinference在本地免费部署多语言语音模型
  • 华为eNSP实战:三层交换机VLAN间通信配置避坑指南(附CE12800特殊命令)
  • Llama-3.2V-11B-cot图文推理保姆级教程:从app.py启动到结果可视化全链路
  • LaserGRBL开源激光雕刻工具:从入门到精通的完整学习路径
  • 告别AT指令恐惧:用Python脚本自动化SIM800L收发短信(附完整代码)
  • Label Studio视频标注深度解析:从时间序列标注到AI模型集成的高级配置