讲师中心 微信公众号
AI工具推荐 视频效率加速

什么是JavaScript中的Promise与异步【教程】

胖浩小哥_6604

胖浩小哥_6604

发布时间:2026-01-16 22:27:35

|

590人浏览过

|

来源于php中文网

原创

Promise是JavaScript异步编程的基础设施,本质是同步执行执行器函数的状态容器,不自动触发异步;then/catch需正确配对,Promise.all全失败而allSettled可获全部结果。

什么是javascript中的promise与异步【教程】

Promise 是 JavaScript 中处理异步操作的标准机制,不是语法糖,也不是可选工具——它是现代 JS 异步编程的基础设施。你写 fetch()、async/await,底层都依赖 Promise 的状态流转和链式能力。


Promise 本质是「状态容器」,不是「自动执行器」

很多人误以为 new Promise() 会“自动开始异步”,其实它只是把一段逻辑(执行器函数)**同步执行一次**,而真正的异步行为(比如 setTimeout、fetch、fs.readFile)得你自己写进去。

const p = new Promise((resolve, reject) => {
  console.log('这行立刻执行'); // ✅ 同步打印
  setTimeout(() => {
    resolve('延迟1秒后才触发');
  }, 1000);
});
console.log('这行在new Promise之后立刻执行'); // ✅ 也同步
  • Promise 构造函数里的回调是**同步执行的**,但里面调用的异步 API(如 setTimeout)才是真正的“异步源头”
  • Promise 本身不控制事件循环,它只负责在异步完成时,按规则把 resolve 或 reject 的值塞进微任务队列
  • 漏写异步调用(比如忘了 setTimeout 或 fetch),Promise 就永远卡在 pending 状态,既不 then 也不 catch

then() 和 catch() 不是“必须成对出现”的开关

常见错误:在 then() 里处理成功,在下一个 then() 里处理失败——这是错的。Promise 链中,catch() 捕获的是**前面所有环节抛出的错误或被 reject 的 Promise**,不是仅捕获上一个 then()。

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
Promise.resolve(1)
  .then(x => { throw new Error('boom') })
  .then(x => console.log('不会执行'))
  .catch(err => console.log('这里会捕获 boom')); // ✅ 正确
  • then(onFulfilled, onRejected) 的第二个参数只能捕获**前一个 Promise 成功后、onFulfilled 函数内部抛出的错误**,不能捕获前一个 Promise 本身被 reject 的情况
  • 推荐统一用 .then(...).catch(...) 形式,避免错误静默丢失
  • catch() 后如果没再抛错,后续 then() 仍会执行(因为 catch 返回的是 fulfilled 状态的新 Promise)

并发请求别硬套 Promise.all(),小心全盘失败

当你用 Promise.all([p1, p2, p3]) 并发请求多个接口,只要其中任意一个被 reject,整个 all 就立刻失败——哪怕另外两个早已成功。这不是 bug,是设计使然。

立即学习“Java免费学习笔记(深入)”;

const p1 = Promise.resolve('a');
const p2 = Promise.reject(new Error('timeout'));
const p3 = Promise.resolve('c');
<p>Promise.all([p1, p2, p3])
.then(console.log) // ❌ 永远不会执行
.catch(err => console.log(err.message)); // ✅ 输出 'timeout'</p>
  • 需要“不管成败都等全部结束”,改用 Promise.allSettled()(ES2020+,现代浏览器和 Node.js ≥12.9.0 支持)
  • 需要“只要一个成功就停”,用 Promise.race();但注意:第一个 reject 也会让 race 失败
  • 兼容老环境?手动封装:对每个 Promise 做 .then(...).catch(...) 包一层,确保返回 always-fulfilled 结构

Promise 的难点不在语法,而在它把「时间不确定性」显式地变成「状态确定性」。你写的每一步 then,都是在声明:“当上一步确认完成(无论成功失败),请把结果交给我”。一旦习惯这种思维,async/await 就只是语法糖,而不是魔法。真正容易被忽略的,是执行器函数里那句没写上的 reject() —— 它不会报错,只会让整个链悬在那里,等你半夜查监控时才发现某个按钮点了没反应。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5109

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3829

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

466

2026.01.19

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4596

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1395

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1818

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

10143

2023.08.17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn