Node.js和Javascript中的async和await

发布于:2025-08-03 ⋅ 阅读:(11) ⋅ 点赞:(0)

JavaScriptNode.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 中,很多核心模块(如 fshttp 等)原本使用回调函数来处理异步任务,而 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/awaitPromise
  • async/await 是对 Promise 的语法糖,提供了更好的错误处理机制(try/catch),以及更简洁的代码结构。
  • 通过 async/await,异步代码的书写接近同步代码,增加了可读性和可维护性。