一篇文章弄懂Node.js和Javascript中的async和await

 更新时间:2025年10月19日 13:43:52   作者:太阳照常升起--  
Async/Await 是基于 Promise 的语法糖,它将异步代码转化为类似同步的书写风格,极大地提升了代码可读性,这篇文章主要介绍了Node.js和Javascript中async和await的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

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/await与Promise:

  • async/await 是对 Promise 的语法糖,提供了更好的错误处理机制(try/catch),以及更简洁的代码结构。
  • 通过 async/await,异步代码的书写接近同步代码,增加了可读性和可维护性。

到此这篇关于Node.js和Javascript中async和await的文章就介绍到这了,更多相关Node.js和JS中async和await内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例

    Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例

    这篇文章主要介绍了Nodejs进阶:如何将图片转成datauri嵌入到网页中去,有兴趣的可以了解一下。
    2016-11-11
  • 使用ExcelJS快速处理Node.js爬虫数据

    使用ExcelJS快速处理Node.js爬虫数据

    Excel.js是一个强大的JavaScript库,它提供了方法处理Excel文件,例如创建和编辑工作簿、读取和写入数据、处理行和列、设置样式、导入和导出数据等,本文介绍使用ExcelJS快速处理Node.js爬虫数据的方法,一起看看吧
    2024-01-01
  • 初步使用Node连接Mysql数据库

    初步使用Node连接Mysql数据库

    这篇文章主要介绍了Node连接Mysql数据库的详细步骤,思路清晰,帮助大家快速使用Node连接Mysql数据库,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Nginx设置为Node.js的前端服务器方法总结

    Nginx设置为Node.js的前端服务器方法总结

    在本篇文章中小编给大家分享了关于Nginx设置为Node.js的前端服务器的方法和实例,需要的朋友们学习下。
    2019-03-03
  • 详解NodeJs项目 CentOs linux服务器线上部署

    详解NodeJs项目 CentOs linux服务器线上部署

    这篇文章主要介绍了NodeJs项目 CentOs linux服务器线上部署,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • node.js Sequelize实现单实例字段或批量自增、自减

    node.js Sequelize实现单实例字段或批量自增、自减

    Sequelize 可以实现针对单个实例的一或多个字段的自增、自减操作,也可以对符合条件的数据进行批量的自增、自减操作。单个实例字段的自增、自减可以利用Instance的相应方法实现,而批量自增、自减则需要借助sequelize提供的字面量方法实现。下面来看看详细的介绍吧。
    2016-12-12
  • node如何实现把包发布到npm上

    node如何实现把包发布到npm上

    这篇文章主要介绍了node如何实现把包发布到npm上的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • nodejs使用redis作为缓存介质实现的封装缓存类示例

    nodejs使用redis作为缓存介质实现的封装缓存类示例

    这篇文章主要介绍了nodejs使用redis作为缓存介质实现的封装缓存类,涉及nodejs操作redis进行缓存设置相关操作技巧,需要的朋友可以参考下
    2018-02-02
  • Node.js进行文件读取与复制的系统总结

    Node.js进行文件读取与复制的系统总结

    这篇文章主要为大家详细介绍了Node.js中文件读取与复制相关内容的系统总结,包括 同步读取,异步读取,复制操作等,有需要的小伙伴可以跟随小编一起了解下
    2025-04-04
  • 三行命令切换Node.js版本的流程步骤

    三行命令切换Node.js版本的流程步骤

    如何在Windows上更新Node.js版本呢?有没有那种不需要重新安装软件再修改配置文件和环境变量的方法?你是否还在为可能要重新安装Node然后配置文件修改环境变量困扰?面就来介绍一下nvm更换node版本的步骤,需要的朋友可以参考下
    2024-01-01

最新评论