javascript Promise是什么_如何使用它

发布时间 - 2025-12-26 00:00:00    点击率:
Promise 是 JavaScript 处理异步操作的标准对象,代表未来完成或失败的操作,具有 pending、fulfilled、rejected 三种不可逆状态;通过 new Promise() 创建,支持链式调用(.then/.catch)、静态方法(all/race/resolve/reject)及 async/await 语法。

Promise 是 JavaScript 中处理异步操作的标准化对象,它代表一个**尚未完成但未来会完成(或失败)的操作**,让你能以更清晰、可链式的方式管理回调,避免“回调地狱”。

Promise 的三种状态

每个 Promise 实例始终处于以下其中一种状态:

  • pending(待定):初始状态,既没成功也没失败
  • fulfilled(已成功):操作成功完成,可通过 .then() 获取结果
  • rejected(已失败):操作出错,可通过 .catch().then(null, handler) 捕获错误

状态一旦改变(pending → fulfilled 或 pending → rejected),就不可逆,也不会再变。

如何创建和使用 Promise

new Promise() 构造函数创建,它接收一个执行器函数(executor),该函数立即执行,并传入两个参数:resolve(成功时调用)和 reject(失败时调用)。

例如,模拟一个 1 秒后返回用户数据的异步请求:

const fetchUser = new Promise((resolve, reject) => {
  setTimeout(() => {
    const success = Math.random() > 0.2; // 80% 概率成功
    if (success) {
      resolve({ id: 123, name: "张三" });
    } else {
      reject(new Error("网络请求失败"));
    }
  }, 1000);
});

使用时推荐链式调用:

fetchUser
  .then(user => {
    console.log("获取成功:", user);
    return user.name.toUpperCase();
  })
  .then(upperName => console.log("大写姓名:", upperName))
  .catch(err => console.error("出错了:", err.message));

常用静态方法:Promise.all、Promise.race、Promise.resolve/reject

这些方法帮你更高效地组合多个 Promise:

  • Promise.all([p1, p2, p3]):全部成功才成功,返回结果数组;任一失败则整体失败
  • Promise.race([p1, p2, p3]):谁先改变状态(无论成功/失败),就采用它的结果
  • Promise.resolve(value):快速创建一个已成功的 Promise(如包装普通值或已有 thenable)
  • Promise.reject(reason):快速创建一个已失败的 Promise

与 async/await 配合更简洁

Promise 是 async/await 的基础。用 async 声明的函数自动返回 Promise,await 可暂停执行,等待 Promise 完成:

async function getUser() {
  try {
    const user = await fetchUser; // 等待 Promise 完成
    console.log("用户:", user);
    return user;
  } catch (err) {
    console.error("加载失败:", err);
  }
}

这比纯 Promise 链读起来更接近同步代码,也更容易调试和错误处理。


# javascript  # java  # ai 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel如何实现数据库事务?(DB Facade示例)  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Android Socket接口实现即时通讯实例代码  动图在线制作网站有哪些,滑动动图图集怎么做?  微信小程序 canvas开发实例及注意事项  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Laravel怎么清理缓存_Laravel optimize clear命令详解  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  如何用AWS免费套餐快速搭建高效网站?  如何用虚拟主机快速搭建网站?详细步骤解析  如何确保FTP站点访问权限与数据传输安全?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  如何在阿里云虚拟服务器快速搭建网站?  微信小程序 五星评分(包括半颗星评分)实例代码  nginx修改上传文件大小限制的方法  Mybatis 中的insertOrUpdate操作  Laravel如何实现本地化和多语言支持?(i18n教程)  Linux网络带宽限制_tc配置实践解析【教程】  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何快速重置建站主机并恢复默认配置?  制作电商网页,电商供应链怎么做?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  如何快速搭建高效香港服务器网站?  Laravel中的Facade(门面)到底是什么原理  Laravel如何实现API速率限制?(Rate Limiting教程)  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  千库网官网入口推荐 千库网设计创意平台入口  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  javascript读取文本节点方法小结  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  香港服务器租用费用高吗?如何避免常见误区?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  微信小程序 HTTPS报错整理常见问题及解决方案