在 JavaScript 和 Node.js 中,async/await
主要用于处理 异步操作。虽然它们都基于 Promise
,但在 Node.js 中,async/await
往往用于处理 I/O 操作、文件操作、数据库查询等,而在 浏览器中的 JavaScript,它更多应用于 AJAX 请求、DOM 操作等场景。
1. 在 JavaScript 中的应用(浏览器):
在浏览器端,async/await
主要用来处理 异步操作,如 AJAX 请求、获取外部数据、处理异步事件 等。以下是几个常见的应用场景:
示例 1:使用 async/await
发送异步请求
假设我们想要通过 fetch()
请求获取数据,使用 async/await
可以让代码看起来更简洁。
async function fetchData() {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts');
const data = await response.json();
console.log('数据获取成功:', data);
} catch (error) {
console.log('请求失败:', error);
}
}
fetchData();
代码解析:
await fetch()
:等待fetch()
请求的响应。由于fetch()
返回一个Promise
,使用await
关键字会暂停函数执行,直到Promise
解析完毕。await response.json()
:当fetch()
请求成功返回时,使用await
等待将响应转换为 JSON 格式的数据。try/catch
:用于捕获请求过程中发生的任何错误。
示例 2:处理多个异步操作并行执行
有时你需要同时执行多个异步操作,async/await
使得并行操作的处理变得更加简单。使用 Promise.all()
可以并行执行多个异步任务。
async function fetchMultipleData() {
try {
const [users, posts] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/users').then(res => res.json()),
fetch('https://jsonplaceholder.typicode.com/posts').then(res => res.json())
]);
console.log('用户数据:', users);
console.log('帖子数据:', posts);
} catch (error) {
console.log('发生错误:', error);
}
}
fetchMultipleData();
代码解析:
Promise.all()
用来并行执行多个异步请求,await
确保所有请求完成后,才继续执行后续代码。
2. 在 Node.js 中的应用:
在 Node.js 中,async/await
主要用于处理文件操作、数据库查询、HTTP 请求等异步任务,尤其是对 I/O 操作 的处理。在 Node.js 中,很多核心模块(如 fs
、http
等)原本使用回调函数来处理异步任务,而 async/await
使得异步操作更易于管理和理解。
示例 1:文件操作
使用 Node.js 的 fs
模块进行异步文件操作时,可以使用 async/await
简化代码,避免回调地狱。
const fs = require('fs').promises; // 使用 fs.promises API,返回的已经是 Promise
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf-8');
console.log('文件内容:', data);
} catch (error) {
console.log('读取文件失败:', error);
}
}
readFile();
代码解析:
fs.readFile
返回一个Promise
,通过await
可以暂停函数执行,等待文件读取完成后再继续执行后续代码。try/catch
捕获文件读取过程中的任何错误。
示例 2:数据库操作(使用 mongoose
)
在使用 MongoDB 数据库时,async/await
非常适合处理数据库的异步操作。假设我们使用 mongoose
(一个 MongoDB 的 ODM)来查询数据库:
const mongoose = require('mongoose');
const User = mongoose.model('User', new mongoose.Schema({ name: String }));
async function getUsers() {
try {
const users = await User.find(); // 使用 async/await 获取所有用户
console.log('用户列表:', users);
} catch (error) {
console.log('数据库查询失败:', error);
}
}
getUsers();
代码解析:
User.find()
是一个异步操作,返回一个Promise
,通过await
等待其完成,并将结果传递给users
变量。
示例 3:HTTP 请求处理
Node.js 用 http
模块处理异步 HTTP 请求时,可以结合 async/await
来提高代码可读性。
const http = require('http');
async function requestHandler(req, res) {
try {
const data = await fetch('https://jsonplaceholder.typicode.com/posts');
const jsonData = await data.json();
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(jsonData));
} catch (error) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('发生错误');
}
}
const server = http.createServer(requestHandler);
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
代码解析:
- 通过
await
等待外部 API 请求的响应,收到数据后进行处理并返回给客户端。
总结:
async/await
的应用:
浏览器端:
async/await
用于处理如 AJAX 请求、API 请求 和 DOM 操作 等异步任务。- 使得异步代码更加简洁和易于理解。
Node.js 中:
async/await
使得文件 I/O 操作、数据库操作、HTTP 请求 等异步任务的代码更加直观。- 它大大简化了回调地狱,使得处理异步操作更清晰。
async/await
与 Promise
:
async/await
是对Promise
的语法糖,提供了更好的错误处理机制(try/catch
),以及更简洁的代码结构。- 通过
async/await
,异步代码的书写接近同步代码,增加了可读性和可维护性。