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

前端笔记之 async/await 异步编程详解

async/await 是现代 JavaScript 中处理异步操作的革命性特性,
它基于 Promise 构建,让异步代码拥有同步代码的可读性和简洁性。

async/await 异步编程详解

  • 核心概念
    • 1. async 函数
    • 2. await 表达式
  • 执行机制详解
    • 1. 事件循环中的 await
    • 2. 错误处理机制
  • 高级用法与模式
    • 1. 并行执行优化
    • 2. 异步迭代
    • 3. 顶级 await(ES2022)
  • 性能优化技巧
    • 1. 避免 await 陷阱
    • 2. 并发控制
  • 与常见异步模式对比
  • 最佳实践
    • 1. 始终处理错误
    • 2. 合理使用 Promise 方法
    • 3. 避免阻塞事件循环
  • 常见陷阱与解决方案
  • Node.js 特定应用
  • 总结
  • 在 Node.js 中使用 async/await 的最佳实践:

核心概念

1. async 函数

声明一个异步函数,自动返回 Promise 对象
函数内部可以使用 await 关键字
语法:async function functionName() { … }

async function fetchData() {return "Data fetched";
}// 等同于
function fetchData() {return Promise.resolve("Data fetched");
}

2. await 表达式

只能在 async 函数内部使用
暂停 async 函数执行,等待 Promise 解决
返回 Promise 的解决值
语法:const result = await promise;

async function getUser() {const response = await fetch('/api/user'); // 等待fetch完成const user = await response.json();        // 等待JSON解析return user;
}

执行机制详解

1. 事件循环中的 await

当遇到 await 时:
暂停 async 函数执行
将函数剩余部分放入微任务队列
继续执行事件循环中的其他任务
当 Promise 解决后,恢复 async 函数执行

console.log("Start");async function example() {console.log("Before await");await new Promise(res => setTimeout(res, 1000));console.log("After await");
}example();console.log("End");/* 输出顺序:
Start
Before await
End
(1秒后)
After await
*/

2. 错误处理机制

async/await 使用 try/catch 处理错误,类似同步代码:

async function fetchWithRetry(url, retries = 3) {try {const response = await fetch(url);if (!response.ok) throw new Error(`HTTP error: ${response.status}`);return await response.json();} catch (error) {if (retries > 0) {console.log(`Retrying... (${retries} left)`);await new Promise(res => setTimeout(res, 1000))
http://www.dtcms.com/a/286568.html

相关文章:

  • 面试高频题 力扣 695.岛屿的最大面积 洪水灌溉(FloodFill) 深度优先遍历 暴力搜索 C++解题思路 每日一题
  • Python网络爬虫之selenium库
  • 第九章 基础设施更新工程
  • 语音控制操作板:人机交互的未来趋势
  • 企业级异常处理方案:Spring Boot自定义异常全局拦截实战
  • 多线程的认识
  • 深入Java注解:从内置到元注解与自定义实战指南
  • 变量提升知识总结
  • 前后端数据交互,关于表单数据传输问题
  • 图机器学习(11)——链接预测
  • Linux和git常用命令
  • TF-IDF(Term Frequency - Inverse Document Frequency)
  • RFID技术赋能智慧物流:实现搬运环节的精准化与高效化
  • 【PTA数据结构 | C语言版】多叉堆的上下调整
  • 【LeetCode 2163. 删除元素后和的最小差值】解析
  • 上市公司-企业超额商誉数据(2005-2023年)-实证数据
  • 《C++继承深度引擎:从内存布局到多态全景拆解》​
  • 飞算科技:以创新科技引领数字化变革,旗下飞算 JavaAI 成开发利器
  • Linux Master 知识库 —— 致 Linux 系统工程师
  • 通信算法之294:LTE系统中的整数倍频偏估计
  • 太阳辐射监测站:洞察太阳能量的科技之眼
  • 【软件系统架构】系列七:系统性能——路由器性能深入解析
  • 告别宕机!Ubuntu自动重启定时任务设置(一键脚本/手动操作)
  • [Raspberry Pi]如何將無頭虛擬顯示器服務(headless display)建置在樹莓派的Ubuntu桌面作業系統中?
  • 汽车免拆诊断案例 | 07款丰田Hilux启动故障
  • Redis——MoreKey
  • 深入理解进程地址空间:虚拟内存与进程独立性
  • nodeJs笔记(六)
  • Ubuntu系统下交叉编译Android的X265库
  • 【leetcode】3202. 找出有效子序列的最大长度(2)