Promise和async/await是现代J*aScript异步编程的核心。Promise通过resolve/reject控制状态,避免回调地狱;async/await以同步语法处理异步操作,提升可读性。实战中用Promise.all实现并发,避免串行阻塞,并结合try/catch确保错误捕获,增强代码健壮性。

在现代 J*aScript 开发中,异步编程是绕不开的核心概念。早期我们依赖回调函数处理异步操作,但容易陷入“回调地狱”。随着语言的发展,Promise 和 async/await 成为更清晰、可控的解决方案。下面通过实战角度深入理解它们的用法与优势。
Promise 表示一个异步操作的最终完成或失败。它有三种状态:pending(进行中)、fulfilled(成功)和 rejected(失败)。一旦状态改变,就不会再变,这保证了异步逻辑的可预测性。
创建一个 Promise 很简单:
const fetchData = new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) {
resolve("数据获取成功");
} else {
reject("请求失败");
}
}, 1000);
});
fetchData
.then(result => console.log(result))
.catch(error => console.error(error));
实际开发中,我们常封装网络请求:
function getJSON(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = () => {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.responseText));
} else {
reject(new Error(`请求失败: ${xhr.status}`));
}
};
xhr.onerror = () => reject(new Error('网络错误'));
xhr.send();
});
}
使用 .then() 链式调用可以串联多个异步任务:
getJSON('/api/user')
.then(user => getJSON(`/api/posts?uid=${user.id}`))
.then(posts => console.log(posts))
.catch(err => console.error('出错了:', err));
async 函数本质上是基于 Promise 的语法糖,可以让异步代码写起来更直观,减少 then 的链式嵌套。
将上面的例子改造成 async/await:
async function loadUserData() {
try {
const user = await getJSON('/api/user');
const posts = await getJSON(`/api/posts?uid=${user.id}`);
console.log(posts);
} catch (err) {
console.error('加载失败:', err);
}
}
loadUserData();
注意点:
Mureka
Mureka是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。
1091
查看详情
函数总是返回一个 Promise真实项目中,经常需要同时发起多个请求并等待全部完成。这时可以用 Promise.all:
async function loadAllData() {
try {
const [users, posts, comments] = await Promise.all([
getJSON('/api/users'),
getJSON('/api/posts'),
getJSON('/api/comments')
]);
console.log({ users, posts, comments });
} catch (err) {
console.error('其中一个请求失败:', err);
}
}
如果希望任一成功即返回,可用 Promise.race;若要所有结果无论成败都返回,使用 Promise.allSettled。
对于顺序执行多个相似任务(如批量上传),可结合数组遍历:
async function uploadFiles(fileList) {
for (let file of fileList) {
try {
await upload(file); // 逐个上传
console.log(`${file.name} 上传成功`);
} catch (err) {
console.error(`${file.name} 上传失败:`, err);
}
}
}
避免滥用 await 导致不必要的串行化。比如两个无关请求应并行执行:
// ❌ 错误:串行等待 const a = await getA(); const b = await getB(); // ✅ 正确:并行发起 const [a, b] = await Promise.all([getA(), getB()]);
始终为 async 函数添加错误处理,尤其是在生产环境中。未捕获的 Promise 错误会触发 unhandledrejection 事件,可能导致应用崩溃。
在前端框架(如 React、Vue)中,通常在副作用中使用 async/await,例如 useEffect 或 onMounted 中启动数据加载,并注意组件卸载时的清理逻辑。
基本上就这些。掌握 Promise 和 async/await 不仅能写出更健壮的异步代码,也为理解现代 JS 生态(如 fetch、EventSource、Web Workers)打下基础。
以上就是Promise与async/await异步编程实战_js现代开发的详细内容,更多请关注其它相关文章!
相关文章:
poki网页游戏推荐_poki免费游戏平台入口
深入理解与实现最大堆的Heapify过程:常见错误与修正
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
J*aScript中localStorage数据的获取、清洗与格式化教程
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
Python复杂任务中断策略:通过回调函数实现优雅停止
曝R星经典之作开发图 设计简陋但信息密集!
抓大鹅无需下载版 抓大鹅秒玩版入口
微博网页版主页入口 微博官方网站免登录访问
Python大型XML文件高效流式解析教程
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
Centos/Linux 系统下安装 composer 的完整步骤
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
智慧团建扫码登录入口 智慧团建扫码登录入口官网版
优化Lar*el Docker镜像:Composer与PHP版本控制策略
c++如何实现单例设计模式_c++线程安全的单例模式写法
J*a递归快速排序中静态变量导致数据累积问题的解决方案
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
iCloud登录入口网页版 苹果iCloud官网登录
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
QQ官网正版登录链接 QQ在线登录入口最新
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
实现全屏滚动与导航点:专业教程
J*a实现学校排课程序_面向对象结构化项目示例
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
解决Flask中Quill编辑器内容提交失败及TypeError的指南
BetterDiscord插件中安全更新用户简介的实践指南
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
Go语言实现持久化与原子性文件存储的教程
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗
Linux如何构建多环境配置管理_Linux多环境配置方案
如何让 composer 信任自签名的 HTTPS 证书源?
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
steam官方入口大全 steam账号注册及操作指南
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
如何在 Windows 11 中启动游戏手柄设置
J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析
J*aScript打印功能_j*ascript输出控制
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
淘宝支付提示失败如何解决 淘宝支付流程优化方法
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
c++项目目录结构应该如何组织_c++工程化项目结构规范