发布时间:2026/8/11 15:31:58
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/8/11 15:31:58

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

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

2026/8/11 15:26:58

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

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

2026/8/11 15:26:58

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

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

2026/8/11 16:37:01

视觉与 NLP 原型落地:先验证哪个真实使用环节

视觉与 NLP 原型落地:先验证哪个真实使用环节文中的事故链路和数值均为说明性场景,不对应特定线上事件;上线标准应按实际压测和业务约束确定。算法工程师最开心的时刻,往往是在 Jupyter Notebook 里敲下 model.evaluate() 看到 F1…

2026/8/11 16:37:01

如何永久免费使用IDM:简单三步解锁高速下载神器

如何永久免费使用IDM:简单三步解锁高速下载神器 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 想要获得极速下载体验却不想花费高昂费用&#xff1f…

2026/8/11 16:37:01

League Akari:英雄联盟LCU工具包的3个颠覆性功能完整指南

League Akari:英雄联盟LCU工具包的3个颠覆性功能完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟游戏中的繁…

2026/8/11 16:37:01

SAP MM 物料移动报错:参考凭证中的移动类型不能转换

COPY移动类型701、702,为Z01/Z02做其他业务处理。在做冲销时系统报错:解决方式:SM30配置视图:V_156N_VC新增条目,功能码使用:ST(冲销)过账类型用:2 冲销 (不可以输入数量…

2026/8/11 16:37:01

深度解析scikit-learn神经网络:从基础到实战的完整指南

深度解析scikit-learn神经网络:从基础到实战的完整指南 【免费下载链接】sklearn-doc-zh :book: [译] scikit-learn(sklearn) 中文文档 项目地址: https://gitcode.com/gh_mirrors/sk/sklearn-doc-zh scikit-learn作为Python机器学习领…

2026/8/11 16:32:01

Go语言并发控制全景指南:从Goroutine到Context的最佳实践

Go语言并发控制全景指南:从Goroutine到Context的最佳实践 引言:为什么需要并发控制 在现代软件开发中,充分利用多核处理器的计算能力是提升应用性能的关键。Go语言自诞生之初,就将并发编程作为其核心特性之一。 Go语言并发模型简介…

2026/8/11 3:03:40

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 5:34:14

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/11 0:00:39

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:39

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/10 11:20:30

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/10 11:20:30

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/11 3:05:11

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…