异步与事件循环
这节要解决什么
明白:为什么 Node 适合「等数据库 / 等网络」这类活,以及 async/await 在 Node 里怎么用。
先用大白话
做菜时:
- 同步:站在锅边死等水开,什么都干不了
- 异步:水开了再叫你,你中间可以切菜
Node 处理大量请求时,不能每个请求都「死等」文件或数据库,否则一个人卡住全员排队。
所以读写文件、发 HTTP、查库,几乎都是异步的。
你已经会 Promise / async-await —— 在 Node 里用法一样。
事件循环可以先记一句:
Node 先尽快跑完同步代码,再在合适的时机处理「已经完成的异步回调 / Promise」。
暂时不必死记 nextTick、微任务队列细节;会写 async/await + try/catch 就够做业务。
对着项目看
在 01-node-cli-notes 里,读写文件用的是 fs/promises(返回 Promise 的版本):
import { readFile, writeFile } from 'node:fs/promises'比老的「回调地狱」好读得多。出错用:
try {
await writeFile(...)
} catch (err) {
console.error('失败了', err.message)
}和前端的对比
| 前端 | Node |
|---|---|
等接口:await fetch | 等文件/数据库:await readFile / Prisma |
| 卡住页面会卡 UI | 卡住事件循环会让整个服务变慢 |
| 别在渲染里干重活 | 别在请求处理里死循环/同步巨量计算 |
验收清单
- 能说出「为什么读写文件常用异步」
- 会用
async/await+try/catch包一层 I/O - 不要求背事件循环细节,但知道「别用同步死等挡着所有请求」
下一节 → 03-fs-path-环境变量.md