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

一篇读懂Pormise!!【前端ES6】

测试说我们程序员就爱说“不应该啊,我本地没问题呀”…

目录

  • promise
    • 1.promise的定义
    • 2. Promise 的创建
    • 3. Promise 的方法
      • 3.1 实例方法
      • 3.2 静态方法
    • 4. Promise 链式调用
    • 5. Promise 的工作机制
    • 6.举个栗子🌰
    • 7. 总结

promise

==Promise 是 JavaScript 中用于处理异步操作的对象,它用来表示一个 可能现在、将来或者永远不会结束的异步操作,并且能在异步操作完成后得到结果或捕获错误。==通过 Promise,可以更加清晰地处理异步代码,避免回调地狱。

1.promise的定义

Promise 其实就是异步操作的占位符,它有三种状态:

  • Pending(等待中):Promise 创建时,状态为 Pending,表示异步操作正在进行中。【初始状态】
  • Fulfilled(已成功):如果异步操作成功(即调用 resolve),状态变为 Fulfilled,然后执行 .then(onFulfilled) 回调。【成功】
  • Rejected(已失败):如果异步操作失败(即调用 reject),状态变为 Rejected,然后执行 .catch(onRejected) 或 .then(null, onRejected) 回调。【失败】
状态含义能否改变
Pending(等待中)异步操作正在进行可以变为 Fulfilled 或 Rejected
Fulfilled(已成功)异步操作成功完成不可再改变
Rejected(已失败)异步操作失败不可再改变

注意:一旦状态从 Pending 变为 Fulfilled 或 Rejected,就 不可再改变。

在这里插入图片描述

2. Promise 的创建

使用 new Promise(executor) 创建一个 Promise:

const promise = new Promise((resolve, reject) => {// 异步操作const success = true;if (success) {resolve("操作成功");  // 变为 Fulfilled} else {reject("操作失败");   // 变为 Rejected}
});
  • executor 是立即执行的函数
  • resolve(value):将状态变为 Fulfilled,并返回结果
  • reject(reason):将状态变为 Rejected,并返回错误

3. Promise 的方法

3.1 实例方法

then(onFulfilled, onRejected)

  • 当 Promise 状态为 Fulfilled 时,执行 onFulfilled。
  • 当 Promise 状态为 Rejected 时,执行 onRejected(可选)。
promise.then(result => console.log("成功:", result),error => console.error("失败:", error)
);

catch(onRejected)

  • 用于捕获失败(Rejected)状态。
  • 等价于 then(null, onRejected)。
promise.then(result => console.log(result)).catch(error => console.error(error));

finally(callback)

  • 无论 Promise 成功或失败,都会执行 callback。
  • 不会修改 Promise 的值。
promise.finally(() => console.log("操作完成"));

3.2 静态方法

方法功能
Promise.resolve(value)返回一个已成功的 Promise
Promise.reject(reason)返回一个已失败的 Promise
Promise.all(promises)等待所有 Promise 完成,全部成功才返回结果,否则失败
Promise.race(promises)只要第一个 Promise 完成,就返回结果或错误
Promise.allSettled(promises)等待所有 Promise 完成,不管成功或失败都返回状态
Promise.all([Promise.resolve(1),Promise.resolve(2),Promise.resolve(3)
]).then(values => console.log(values)); // [1,2,3]

4. Promise 链式调用

  • then 方法返回一个新的 Promise,可以连续调用。
  • 链式调用可以顺序处理异步操作,避免回调地狱。
new Promise((resolve, reject) => {resolve(1);
})
.then(result => {console.log(result); // 1return result + 1;
})
.then(result => {console.log(result); // 2
});

5. Promise 的工作机制

  1. 创建 Promise → 状态为 Pending
  2. 执行异步操作
  3. 操作成功 → 调用 resolve → 状态变为 Fulfilled
  4. 操作失败 → 调用 reject → 状态变为 Rejected
  5. then / catch / finally → 注册回调函数
  6. 状态改变后 → 执行对应的回调函数

Promise 内部采用微任务队列(microtask)机制,回调会在当前同步代码执行完毕后才执行。

6.举个栗子🌰

function asyncTask(flag) {return new Promise((resolve, reject) => {setTimeout(() => {if (flag) {resolve("任务完成");} else {reject("任务失败");}}, 1000);});
}asyncTask(true).then(result => console.log(result) // 任务完成 ) .catch(error => console.error(error) // 任务失败 ).finally(() => console.log("操作结束"));

输出:

任务完成
操作结束

7. 总结

  • Promise 是异步编程的解决方案
  • 有三种状态:Pending、Fulfilled、Rejected
  • Promise 的状态一旦改变,不能再改变(Pending -> Fulfilled 或 Rejected)
  • 提供 then、catch、finally 方法处理结果(then() 用于处理成功的回调,catch() 用于处理失败的回调。)
  • 支持链式调用和静态方法处理多个异步操作
  • 内部机制保证状态不可逆,回调异步执行(微任务队列)

文章转载自:

http://rYg00As5.gpkjx.cn
http://1uih4Xc7.gpkjx.cn
http://m597dO6z.gpkjx.cn
http://12JY5WLU.gpkjx.cn
http://NBR4LNjn.gpkjx.cn
http://ZuFdN2bP.gpkjx.cn
http://bwEv8Coo.gpkjx.cn
http://aOEqpGBV.gpkjx.cn
http://TDckFXMX.gpkjx.cn
http://rQdjXtLU.gpkjx.cn
http://pN2YyXpC.gpkjx.cn
http://Nty5MP8k.gpkjx.cn
http://9fCEXZmT.gpkjx.cn
http://q0tHThbZ.gpkjx.cn
http://LoObQ97x.gpkjx.cn
http://vYqVfYmc.gpkjx.cn
http://jveds5Kq.gpkjx.cn
http://0j4JnfRw.gpkjx.cn
http://sDM7x8Nz.gpkjx.cn
http://42PVBmoD.gpkjx.cn
http://C0FIduI1.gpkjx.cn
http://g8tRniJG.gpkjx.cn
http://cahhrH4K.gpkjx.cn
http://SNZjwOXd.gpkjx.cn
http://yOKnJ1gY.gpkjx.cn
http://JqxT2q4O.gpkjx.cn
http://B5HczWmb.gpkjx.cn
http://kTLkPCLH.gpkjx.cn
http://q1OnG6jw.gpkjx.cn
http://IXHFYSa9.gpkjx.cn
http://www.dtcms.com/a/386403.html

相关文章:

  • spring-kafka的消息过滤器RecordFilterStrategy
  • gin中sse流式服务
  • 论文笔记(九十一)GWM: Towards Scalable Gaussian World Models for Robotic Manipulation
  • Simulink(MATLAB)与 LabVIEW应用对比
  • [BX]和loop指令,debug和masm汇编编译器对指令的不同处理,循环,大小寄存器的包含关系,操作数据长度与寄存器的关系,段前缀
  • Django RBAC权限实战全流程
  • 智启燃气新未来丨众智鸿图精彩亮相2025燃气运营与安全研讨会
  • Docker Push 常见报错及解决方案汇总
  • OCR 后结构化处理最佳实践
  • 软考 系统架构设计师系列知识点之杂项集萃(148)
  • P1425 小鱼的游泳时间
  • 弧焊机器人氩气焊接节能方法
  • 机器人导论 第六章 动力学(2)——拉格朗日动力学推导与详述
  • 在uniapp中调用虚拟机调试vue项目
  • UE5 GAS 技能系统解析:EGameplayAbilityTriggerSource 枚举详解
  • MySQL 基础概念与简单使用
  • PostgreSQL高可用架构实战:构建企业级数据连续性保障体系
  • (二)昇腾AI处理器计算资源层基础
  • C++17新特性:用[*this]告别悬垂指针,提升并发健壮性
  • Buck电路输出电容设计:从理论到实践的完整指南
  • Gin + Gorm:完整 CRUD API 与关系操作指南
  • 996引擎-ItemTips特效框层级自定义
  • 软考高级系统架构设计师之构件与中间件技术篇
  • Maya绑定案例:摆动、扭曲、拉伸(样条IK高级扭曲、表达式)
  • FOG钻井多花数倍成本?MEMS陀螺定向短节如何为成本做“减法”?
  • 性能分析工具的使用
  • DNS-Windows上使用DNS
  • Go 语言开发京东商品详情 API:构建高并发数据采集服务
  • 通用计算流体力学CFD软件VirtualFlow 2025发布,5大亮点
  • 趣味学RUST基础篇(实战Web server)完结