Async/Await 详解
什么是 Async/Await?
Async/Await 是异步编程中中断当前函数的语法糖,使得程序员可以像书写同步代码那样来书写异步代码,让异步代码的编写和阅读更加直观和简单。它本质上是一种更优雅的异步编程方式。
基本语法
1. Async 函数
javascript
async function fetchData() {
// 函数体
}
2. Await 表达式
javascript
async function fetchData() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
}
Async/Await 的工作原理
Async 函数
- 总是返回一个 Promise
- 可以使用 return 返回值
- 可以使用 throw 抛出错误
Await 表达式
- 暂停 async 函数的执行
- 等待 Promise 完成
- 返回 Promise 的结果
错误处理
1. Try-Catch 方式
javascript
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
} catch (error) {
console.error('Error:', error);
throw error;
}
}
2. Promise.catch 方式
javascript
async function fetchData() {
const response = await fetch('https://api.example.com/data')
.catch(error => {
console.error('Fetch error:', error);
throw error;
});
const data = await response.json();
return data;
}
并发执行
1. 顺序执行
javascript
async function sequential() {
const result1 = await task1();
const result2 = await task2();
return [result1, result2];
}
2. 并行执行
javascript
async function parallel() {
const [result1, result2] = await Promise.all([
task1(),
task2()
]);
return [result1, result2];
}
常见用法
1. 数据获取
javascript
async function getUserData(userId) {
const user = await fetchUser(userId);
const posts = await fetchUserPosts(userId);
return { user, posts };
}
2. 文件操作
javascript
async function processFile(filePath) {
const content = await fs.promises.readFile(filePath, 'utf8');
const processed = await processContent(content);
await fs.promises.writeFile(filePath, processed);
}
3. 数据库操作
javascript
async function updateUser(userId, data) {
const connection = await getConnection();
try {
await connection.beginTransaction();
await connection.query('UPDATE users SET ? WHERE id = ?', [data, userId]);
await connection.commit();
} catch (error) {
await connection.rollback();
throw error;
} finally {
connection.release();
}
}
最佳实践
错误处理
- 总是使用 try-catch
- 适当处理错误传播
- 提供有意义的错误信息
性能优化
- 使用 Promise.all 进行并行操作
- 避免不必要的 await
- 注意内存使用
代码组织
- 保持函数简短
- 使用有意义的命名
- 添加适当的注释
资源管理
- 及时释放资源
- 使用 try-finally
- 处理超时情况
注意事项
不要滥用 await
- 只在必要时使用 await
- 避免不必要的等待
- 考虑并行执行
避免回调地狱
- 使用 async/await 替代回调
- 保持代码扁平化
- 使用 Promise.all 处理并发
注意内存使用
- 避免内存泄漏
- 及时释放资源
- 监控内存使用
总结
Async/Await 是处理异步操作的强大工具,它让异步代码更加清晰和易于维护。正确使用 Async/Await 可以显著提高代码质量和开发效率。记住要适当处理错误、优化性能、管理资源,并遵循最佳实践。