Node.js入门教程(十四):async/await

发布时间:2026/10/2 1:55:17

Node.js入门教程(十四):async/await 一、什么是 async/await在 Node.js 中async/await 是一种处理异步操作的语法糖。async/await 基于 Promise但让异步代码看起来更像同步代码极大地提高了代码的可读性和可维护性。async关键字用于声明一个函数是异步的而await关键字用于等待一个 Promise 的解决resolve或拒绝reject。使用 async/await 可以避免回调地狱callback hell并使错误处理更加直观。二、基本语法async 函数任何函数都可以通过添加async关键字变成异步函数async function myFunction() { return Hello World; } // 等价于 function myFunction() { return Promise.resolve(Hello World); }async函数总是返回一个 Promise。如果返回值不是 Promise它会被自动包装成 Promise。await 表达式await只能在async函数内部使用它会暂停函数的执行等待 Promise 解决然后继续执行并返回结果async function fetchData() { const response await fetch(https://api.example.com/data); const data await response.json(); return data; }三、错误处理try/catch 方式处理 async/await 错误最常用的方法是使用try/catchasync function getUser() { try { const response await fetch(https://api.example.com/user); const user await response.json(); return user; } catch (error) { console.error(Error fetching user:, error); throw error; // 可以选择重新抛出错误 } }直接处理 Promise你也可以直接处理返回的 PromisegetUser() .then(user console.log(user)) .catch(error console.error(error));四、实际应用示例并行执行多个异步操作使用Promise.all结合 async/await 可以并行执行多个异步操作async function fetchMultipleUrls(urls) { try { const requests urls.map(url fetch(url)); const responses await Promise.all(requests); const data await Promise.all(responses.map(r r.json())); return data; } catch (error) { console.error(Error fetching data:, error); throw error; } } // 使用 const data await fetchMultipleUrls([ https://api.example.com/users, https://api.example.com/posts ]);顺序执行 vs 并行执行顺序执行较慢适合有依赖关系的操作async function sequentialTasks() { const user await getUser(); // 等待完成 const posts await getPosts(); // 再执行下一个 return { user, posts }; }并行执行较快适合独立的操作async function parallelTasks() { const userPromise getUser(); const postsPromise getPosts(); const [user, posts] await Promise.all([userPromise, postsPromise]); return { user, posts }; }数据库操作示例async function getUserAndPosts(userId) { try { const user await User.findById(userId); const posts await Post.find({ userId }); return { user, posts }; } catch (error) { console.error(Database error:, error); throw error; } }文件操作示例const fs require(fs).promises; async function readFiles() { try { const data1 await fs.readFile(file1.txt, utf8); const data2 await fs.readFile(file2.txt, utf8); console.log(Data:, data1, data2); } catch (err) { console.error(读取文件出错:, err); } }五、最佳实践实践说明总是处理错误不要忽略 await 可能抛出的错误使用 try/catch 或.catch()处理避免不必要的 await如果不需要等待结果可以直接返回 Promise合理使用并行多个独立的异步操作应该并行执行使用Promise.all保持代码清晰避免过深的 async/await 嵌套必要时提取函数注意性能影响每个 await 都会暂停函数执行在循环中要特别注意六、常见问题async/await 与 Promise 的关系async/await 是建立在 Promise 之上的语法糖。任何async函数都返回 Promise任何await后面都可以接 Promise。// async/await 和 Promise 可以混用 async function processUser() { const user await getUser(); const posts await getPosts(user.id); return posts; // 等价于 return Promise.resolve(posts) } // 返回的异步函数本身就是 Promise processUser().then(posts console.log(posts));为什么我的 async 函数返回 undefined这可能是因为忘记在 await 前使用return或者在 Promise 解决前函数就退出了。// 错误示例没有 return返回 undefined async function getData() { await fetch(url); // 没有 return } // 正确示例使用 return async function getData() { return await fetch(url); } // 或者直接返回 Promise async function getData() { return fetch(url); // 自动包装为 Promise }可以在顶层使用 await 吗在ES 模块中文件以.mjs结尾或package.json中type: module可以直接在顶层使用await。在 CommonJS 模块中需要包裹在 async 函数中。// ES 模块中可以直接使用顶层 await const data await fetchData(); console.log(data); // CommonJS 模块中需要包裹 (async () { const data await fetchData(); console.log(data); })();七、本章小结知识点说明async声明异步函数返回 Promiseawait等待 Promise 解决只能在 async 函数中使用错误处理使用try/catch或.catch()处理异步错误并行执行使用Promise.all同时执行多个独立的异步操作顺序执行使用await依次执行有依赖关系的异步操作顶层 awaitES 模块中支持CommonJS 中需包裹在 async 函数中提示async/await 是现代 Node.js 异步编程的推荐方式。它让异步代码看起来像同步代码大大提高了代码的可读性和可维护性。但要记住await会暂停函数执行在循环中使用时要考虑性能影响无关的操作应该用Promise.all并行执行。
延伸阅读

更多相关文章

2026/10/1 23:03:29

Windows系统Spark 3.x本地环境搭建与避坑指南

1. Windows本地Spark环境搭建全指南 作为大数据处理领域的明星框架,Spark凭借其内存计算优势和丰富的生态组件,已经成为企业级数据分析的标准工具之一。但很多开发者在Windows系统上搭建Spark环境时,总会遇到各种"坑"——从Java版本…

2026/9/19 17:35:02

单相电机电容原理与风扇故障排查:从嗡嗡声到精准修复

1. 这篇文章真正要解决的问题 夏天到了,家里的风扇突然罢工,按下开关只有嗡嗡声,扇叶纹丝不动。你上网一搜,满屏都是“风扇不转怎么办?加颗电容就能转起来”。这个说法流传甚广,听起来简单又神奇&#xff0…

2026/10/1 7:21:06

Linux进程线程通信机制与性能优化实战

1. Linux开发中进程线程间的通信机制全景解析 在Linux系统开发中,进程和线程间的通信(IPC)是构建复杂应用程序的基础能力。不同于Windows系统,Linux继承了Unix的设计哲学,提供了一套丰富多样的IPC机制,每种…

2026/10/2 1:53:03

快速上手 uv:Python 包与项目管理器的 tldr 速查指南

文档教程知识库 【免费下载链接】tldr Collaborative cheatsheets for console commands 📚. 项目地址: https://gitcode.com/GitHub_Trending/tl/tldr 点击查看 免费下载 导读 uv 是一个以“快”著称的 Python 包管理器与项目管理器,用一条…

2026/10/1 5:21:14

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/1 17:09:46

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/2 0:02:57

PWN入门:从栈溢出原理到ROP链实战

1. 这不是“学PWN”,是重新理解你每天敲的每一行C代码我第一次在CTF赛场上写出能控制程序流的exp时,手抖得连gdb的c命令都输错三次。那道题只有23行C代码,一个gets()调用,一个printf(),一个return——它甚至没开NX&…

2026/10/2 0:02:57

Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案

1. 一个反直觉的显存占用现象第一次在 Windows 上看到cudaMallocHost把显存吃掉的时候,我的反应是打开任务管理器反复确认了三遍。明明调用的是主机端锁页内存分配,按 CUDA 文档的说法,这块内存应该落在系统 RAM 里,跟 GPU 的显存…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑