异步/等待(Async/Await)是一种用于处理异步操作的现代JavaScript语法。它使得异步代码的编写和阅读更加直观和简单。通过使用async
和await
关键字,你可以像编写同步代码一样编写异步代码。
try...catch
语句来处理异步操作中的错误。异步/等待函数可以是:
异步/等待函数广泛应用于需要处理异步操作的场景,例如:
fetch
或axios
)fs.promises
)mongoose
或sequelize
)以下是一个使用多个异步/等待函数的示例:
// 模拟异步操作
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function fetchUserData(userId) {
await delay(1000);
return { userId, name: 'John Doe', age: 30 };
}
async function fetchUserPosts(userId) {
await delay(1500);
return [
{ postId: 1, title: 'First Post' },
{ postId: 2, title: 'Second Post' }
];
}
async function getUserInfo(userId) {
try {
const userData = await fetchUserData(userId);
const userPosts = await fetchUserPosts(userId);
return { userData, userPosts };
} catch (error) {
console.error('Error fetching user info:', error);
throw error;
}
}
// 调用getUserInfo函数
getUserInfo(1)
.then(info => console.log(info))
.catch(error => console.error(error));
原因:虽然异步/等待使得代码更易读,但如果不当使用,可能会导致过多的上下文切换,从而影响性能。
解决方法:
Promise.all
来并发执行多个异步操作,而不是串行执行。async function getUserInfoConcurrently(userId) {
try {
const [userData, userPosts] = await Promise.all([
fetchUserData(userId),
fetchUserPosts(userId)
]);
return { userData, userPosts };
} catch (error) {
console.error('Error fetching user info:', error);
throw error;
}
}
// 调用getUserInfoConcurrently函数
getUserInfoConcurrently(1)
.then(info => console.log(info))
.catch(error => console.error(error));
通过以上示例和解释,你应该能够理解如何使用多个异步/等待函数,并解决一些常见问题。
领取专属 10元无门槛券
手把手带您无忧上云