async/await
是 ECMAScript 2017(ES8)引入的一组新特性,用于简化 JavaScript 中的异步编程。它们提供了一种更清晰和直观的方式来处理异步操作,使得代码更易读、更易维护。以下是 async/await
的基本用法:
async
函数:
- 定义: 使用
async
关键字定义的函数称为异步函数。 - 返回值: 异步函数总是返回一个 Promise 对象。
- 异步操作: 在异步函数内部,可以使用
await
关键字等待其他异步操作完成。
async function fetchData() {
// 异步操作,例如网络请求
let response = await fetch('https://api.example.com/data');
let data = await response.json();
return data;
}
// 调用异步函数
fetchData().then(result => {
console.log(result);
}).catch(error => {
console.error(error);
});
await
关键字:
- 用法:
await
关键字只能在异步函数内部使用,用于等待一个 Promise 对象的解决。 - 等待时间: 在遇到
await
语句时,执行流会暂时离开当前函数,等待await
后面的 Promise 对象状态变为 resolved(解决)或 rejected(拒绝)。
async function example() {
console.log('Start');
// 使用 await 等待 Promise 对象
let result = await new Promise(resolve => {
setTimeout(() => {
resolve('Async operation complete');
}, 1000);
});
console.log(result);
console.log('End');
}
// 调用异步函数
example();
错误处理:
使用 try/catch
块可以很方便地捕获异步操作中的错误:
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data');
let data = await response.json();
return data;
} catch (error) {
console.error('Error fetching data:', error);
throw error; // 可以选择重新抛出错误
}
}
并行执行多个异步任务:
可以使用 Promise.all()
来并行执行多个异步任务:
async function fetchMultipleData() {
try {
let [data1, data2] = await Promise.all([
fetch('https://api.example.com/data1').then(response => response.json()),
fetch('https://api.example.com/data2').then(response => response.json())
]);
console.log(data1, data2);
} catch (error) {
console.error('Error fetching data:', error);
}
}
async/await
的引入使得异步代码更具可读性和可维护性,减少了回调地狱(Callback Hell)的问题,使得异步编程更加直观和类似于同步编程的风格。