javascript异步编程如何理解_promise和async_await怎样使用【教程】
发布时间 - 2026-01-31 00:00:00 点击率:次Promise 是封装未来完成或失败异步操作的对象,非语法糖或同步魔法;它立即执行 executor,通过 .then/.catch 处理结果,链式调用返回新 Promise;async/await 是其语法糖,await 不阻塞线程但需 try/catch 捕错。
Promise 是什么,不是什么
Promise 不是语法糖,也不是让异步变同步的魔法。它是一个对象,用来封装一个**尚未完成但未来会完成(或失败)的异步操作**,并提供统一的 .then()/.catch() 接口处理结果。
常见误解是把它当“等待器”——new Promise() 立即执行 executor 函数,内部的异步逻辑(比如 setTimeout 或 fetch)才决定 resolve/reject 的时机。Promise 本身不暂停代码执行。
- 构造时传入的函数(executor)是同步运行的,但通常在里面启动异步任务
-
Promise.resolve(value)和Promise.reject(reason)用于快速创建已决议的 Promise - 链式调用中,每个
.then()返回的是**新 Promise**,值传递靠 return,错误传递靠 throw 或返回 rejected Promise
async/await 是 Promise 的语法糖,不是新机制
async 函数必定返回 Promise,哪怕你写 return 42,实际返回的是 Promise.resolve(42);await 只是让 JS 引擎在遇到 Promise 时暂停当前 async 函数的执行,等它 settled 后再继续——它不阻塞线程,也不影响事件循环。
注意:await 只能在 async 函数内使用,顶层 await 仅在模块(type="module")中有效。
-
await后面不强制是 Promise,非 Promise 值会被自动包装成 resolved Promise - 错误必须用
try/catch捕获,.catch()在 async 函数外才能接住抛出的异常 - 多个独立请求别用
await串行写,该用Promise.all([p1, p2])并发发
常见错误:混淆状态、忽略错误、滥用 await
最典型的问题是以为 await promise 能“修复”被 reject 的 Promise——其实它只是把 rejection 变成 throw,不 catch 就崩。
另一个高频坑是把本可并发的请求写成串行:
async function bad() {
const a = await fetch('/api/a').then(r => r.json());
const b = await fetch('/api/b').then(r => r.json()); // 等 a 完了才发 b
return [a, b];
}
正确做法是先发两个请求,再 await 它们的结果:
async function good() {
const [a, b] = await Promise.all([
fetch('/api/a').then(r => r.json()),
fetch('/api/b').then(r => r.json())
]);
return [a, b];
}
- 忘记处理 reject → 页面白屏或静默失败;加
try/catch或在最后链.catch(console.error) - 在循环里直接 await → 实际是串行,性能差;需用
map().map或
(p => p.then(...))
Promise.allSettled() - 用
await包裹已执行完的 Promise → 没必要,纯属多绕一层
调试 Promise 链和 await 的实际技巧
Chrome 和 Firefox 控制台能显示 Promise 状态(pending/resolved/rejected),但不会显示中间 resolve 值。想看清每一步,要么加 console.log,要么用 async 函数拆分逻辑块。
Node.js 中可通过 --trace-warnings 暴露未捕获的 Promise rejection;浏览器可用 window.addEventListener('unhandledrejection', ...) 兜底。
- 链式调用过长时,优先拆成小的
async函数,比堆.then().then().then()更易读 -
await Promise.resolve().then(...)是无效延迟,等同于直接执行;真要微任务延迟,用await Promise.resolve() - 测试时模拟 reject,别只 mock 成功路径;用
jest.mock或sinon.stub().rejects()覆盖错误分支
# javascript
# java
# js
# node.js
# json
# node
# go
# 浏览器
# ai
# win
# 异步任务
# firefox
# chrome
# 封装
# try
# throw
# catch
# Error
# 循环
# 接口
# 堆
# 线程
# 值传递
# map
# 并发
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JavaScript Ajax实现异步通信
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
黑客如何通过漏洞一步步攻陷网站服务器?
Swift中switch语句区间和元组模式匹配
Laravel如何为API生成Swagger或OpenAPI文档
音响网站制作视频教程,隆霸音响官方网站?
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
如何用虚拟主机快速搭建网站?详细步骤解析
如何获取PHP WAP自助建站系统源码?
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
Android仿QQ列表左滑删除操作
大学网站设计制作软件有哪些,如何将网站制作成自己app?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
网站图片在线制作软件,怎么在图片上做链接?
网站制作软件有哪些,制图软件有哪些?
如何挑选优质建站一级代理提升网站排名?
晋江文学城电脑版官网 晋江文学城网页版直接进入
MySQL查询结果复制到新表的方法(更新、插入)
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
如何在阿里云服务器自主搭建网站?
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
如何快速选择适合个人网站的云服务器配置?
Python图片处理进阶教程_Pillow滤镜与图像增强
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
轻松掌握MySQL函数中的last_insert_id()
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
利用python获取某年中每个月的第一天和最后一天
Laravel中的Facade(门面)到底是什么原理
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
网站建设整体流程解析,建站其实很容易!
Laravel如何处理表单验证?(Requests代码示例)
EditPlus中的正则表达式实战(5)
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
详解MySQL数据库的安装与密码配置
北京网站制作的公司有哪些,北京白云观官方网站?
Bootstrap CSS布局之列表
JavaScript如何实现音频处理_Web Audio API如何工作?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)


