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

认识 Promise

一、使用Promise管理异步任务的基础步骤

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>认识Promise</title>
</head><body><script>/*** 目标:使用Promise管理异步任务*/// 1、创建Promise对象const p = new Promise((resolve,reject) => {// 2、执行异步代码setTimeout(() => {resolve('模拟AJAX请求-成功的结果')},2000)})// 3、获取结果p.then(result => {console.log(result);})</script>
</body></html>

运行结果如下:

image

.catch:处理失败的结果(对应 reject),代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>认识Promise</title>
</head><body><script>/*** 目标:使用Promise管理异步任务*/// 1、创建Promise对象const p = new Promise((resolve,reject) => {// 2、执行异步代码setTimeout(() => {// resolve('模拟AJAX请求-成功的结果')reject(new Error('模拟AJAX请求-失败的结果'));},2000)})// 3、获取结果p.then(result => {console.log(result);}).catch(error => {console.log(error)})</script>
</body></html>

运行结果如下:

image

 二、Promise 三种状态

Promise 对象在生命周期中只会处于以下三种状态之一,且状态的转换有严格的规则:

1. pending(等待 / 进行中)

 
  • 含义:这是 Promise 的初始状态,表示异步操作还未完成,结果尚未确定。
  • 特点
    • 刚创建 Promise 时,默认处于这个状态;
    • 此时既不是成功,也不是失败。
     
  • 示例
// 刚创建的 Promise 处于 pending 状态
const p = new Promise((resolve, reject) => {// 异步操作还在执行中(比如定时器还没到时间)setTimeout(() => {}, 1000);
});
console.log(p); // 控制台会显示 Promise { <pending> }

使用一下实战的代码,如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>认识Promise</title>
</head><body><script>/*** 目标:使用Promise管理异步任务*/// 1、创建Promise对象const p = new Promise((resolve,reject) => {// 2、执行异步代码setTimeout(() => {// resolve('模拟AJAX请求-成功的结果')reject(new Error('模拟AJAX请求-失败的结果'));},2000)})console.log(p);// 3、获取结果p.then(result => {console.log(result);}).catch(error => {console.log(error)})</script>
</body></html>

运行结果如下

image

以上截图要在2秒内打开 ,可以看到是“pending”状态。

如果是在2s之后打开的,就是另一种状态了。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>认识Promise</title>
</head><body><script>/*** 目标:使用Promise管理异步任务*/// 1、创建Promise对象const p = new Promise((resolve,reject) => {// Promose对象创建时,此处的代码就会立即执行,测试如下:console.log('Promise 代码已执行了!')// 2、执行异步代码setTimeout(() => {// resolve('模拟AJAX请求-成功的结果')reject(new Error('模拟AJAX请求-失败的结果'));},5000)})console.log(p);// 3、获取结果p.then(result => {console.log(result);}).catch(error => {console.log(error)})</script>
</body></html>

运行结果如下

image

 可以看到,

console.log('Promise 代码已执行了!'

上面 这段代码先于

console.log(p);

显示出来了,说明Promise对象创建的时候里面的代码就执行了的。

2. fulfilled(已成功 / 已兑现)

 
  • 含义:表示异步操作成功完成,Promise 会将操作结果传递出去。
  • 触发条件:在 Promise 执行器函数中调用 resolve() 方法时,状态会从 pending 转为 fulfilled
  • 特点:状态一旦变为 fulfilled,就永久固定,不会再改变。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>认识Promise</title>
</head><body><script>/*** 目标:使用Promise管理异步任务*/// 1、创建Promise对象const p = new Promise((resolve,reject) => {// Promose对象创建时,此处的代码就会立即执行,测试如下:console.log('Promise 代码已执行了!')// 2、执行异步代码setTimeout(() => {resolve('模拟AJAX请求-成功的结果')// reject(new Error('模拟AJAX请求-失败的结果'));},2000)})console.log(p);// 3、获取结果p.then(result => {console.log(result);}).catch(error => {console.log(error)})</script>
</body></html>

运行结果如下

image

3. rejected(已失败 / 已拒绝)

 
  • 含义:表示异步操作执行失败,Promise 会将失败的原因(错误信息)传递出去。
  • 触发条件:在 Promise 执行器函数中调用 reject() 方法,或执行器内部抛出未捕获的错误时,状态会从 pending 转为 rejected
  • 特点:状态一旦变为 rejected,同样永久固定,不会再改变。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>认识Promise</title>
</head><body><script>/*** 目标:使用Promise管理异步任务*/// 1、创建Promise对象const p = new Promise((resolve,reject) => {// Promose对象创建时,此处的代码就会立即执行,测试如下:console.log('Promise 代码已执行了!')// 2、执行异步代码setTimeout(() => {// resolve('模拟AJAX请求-成功的结果')reject(new Error('模拟AJAX请求-失败的结果'));},2000)})console.log(p);// 3、获取结果p.then(result => {console.log(result);}).catch(error => {console.log(error)})</script>
</body></html>

运行结果如下

image

状态转换的核心规则

 
Promise 的状态转换是单向且不可逆的,只有两种合法的转换路径:
 
  1. pendingfulfilled(异步操作成功)
  2. pendingrejected(异步操作失败)
 
注意
 
  • 不存在 fulfilledrejectedrejectedfulfilled 这类反向转换;
  • 也不存在 fulfilled/rejected 转回 pending 的情况;
  • 即使多次调用 resolve()reject(),也只有第一次调用会生效(状态一旦改变,后续调用无效)。

示例验证状态不可逆:

const p = new Promise((resolve, reject) => {resolve("第一次调用"); // 状态转为 fulfilledreject("后续调用无效"); // 无效果,状态已固定
});
p.then(res => console.log(res)) // 输出:第一次调用.catch(err => console.error(err)); // 不会执行

 

http://www.jsqmd.com/news/294474/

相关文章:

  • WebApp 本地部署全景指南(实战版)
  • 雅思课培训机构深度测评排行榜:从行业痛点解析到优选方案(2026版)
  • 吐血推荐!10个AI论文网站测评:本科生毕业论文必备工具
  • 实测封神!2026高中线上补习班TOP5:选对1家,提分少走3年弯路
  • 连接数据库并部署到Linux上使用Docker Compose编排的go语言网络聊天室
  • 性价比高的太原文创伴手礼定制厂家
  • 工程化思维破解协同与锁死难题:Java企业的AI集成新思路
  • 2025年商业邮件诈骗攻击趋势深度解析
  • ijkplayer相关实用链接
  • 云上 + 私有化:Java 企业 AI 模型调用的双向适配方
  • 名校冲刺攻略:揭秘2026高提分培优机构
  • 2026济南雅思培训学校深度测评TOP榜:济南优质机构口碑排名与高效提分方案解析
  • 2026沪上培优大揭秘:这些机构凭实力出圈
  • 全网最全9个一键生成论文工具,自考学生必备!
  • 【2026最新榜单】济南雅思培训机构谁更强?全网深度测评与高分提分方案拆解
  • 一种交互式可解释人工智能方法,用于改进数字细胞病理学癌症亚型分类中的人机协作|文献速递-文献分享 - 教程
  • MATLAB代码:考虑多种天气条件下光伏电站太阳能辐射量预测 关键词:辐射量预测 光伏预测 多...
  • 2026全网雅培训机构深度测评TOP5:高分提分方案权威推荐
  • 完整教程:未来之窗昭和仙君(二十八)商业收银开发音频播放——东方仙盟筑基期
  • 2026沪上学子提分秘籍:靠谱班课补习机构大揭秘
  • MATLAB实现轴承刚度计算
  • 高分冲刺必备|雅思网上辅导 2026 全维度测评权威排行 全阶段适配榜单推荐
  • 2026上海班课补习机构测评!
  • 上海初中班课怎么选不踩雷?5家口碑机构+3大避坑法,家长直接抄作业
  • 上海基础差学生逆袭指南!5类班课机构精准匹配,选课避坑全攻略
  • 2026年太空舱企业优选指南:如何挑选国内新型微宿?知名的太空舱制造厂家忠军装备满足多元需求
  • 2026年趋势:高速印刷机如何匹配不同加工厂需求,市面上高速印刷机制造厂怎么选购技术实力与市场典范解析
  • 2026 雅思网上辅导全维度测评推荐|全地域适配 留学衔接 TOP 榜
  • CTF Writeup:Misc题型之流量分析实战(Wireshark使用指南)
  • 【CTF Writeup】Crypto题型之AES加密算法破解与实战