回调与回调地狱
Node 的异步最初只有回调:函数接收一个 callback,约定第一个参数永远是 err(错误优先回调)。当异步操作层层嵌套时,代码就会右移成“>”形——这就是臭名昭著的回调地狱。
解药依次是:Promise(then 链式调用消除嵌套)、async/await(用同步外形写异步)、以及把每一步拆成命名函数。错误优先回调 + 嵌套是维护灾难,新代码不应再写。
- 回调约定:第一个参数 err,无 err 时才是业务结果
- 回调地狱 = 层层嵌套的异步代码,难以阅读与错误处理
- .then() 链 / async/await 让异步代码重新“变直”
JS
// 回调地狱:读用户 → 读权限 → 读日志,三层右移 const fs = require('fs'); const fsp = fs.promises; fs.readFile('./user.json', 'utf8', (err1, user) => { if (err1) return console.error(err1); fs.readFile('./perm.json', 'utf8', (err2, perm) => { if (err2) return console.error(err2); fs.readFile('./log.json', 'utf8', (err3, log) => { if (err3) return console.error(err3); console.log(user, perm, log); // 已经缩进到怀疑人生 }); }); }); // 同样的逻辑,Promise 链: fsp.readFile('./user.json', 'utf8') .then(user => fsp.readFile('./perm.json', 'utf8').then(perm => [user, perm])) .then(([user, perm]) => console.log(user, perm)) .catch(e => console.error('任意一步出错都会到这里:', e.message));
本节要点回调地狱的本质是“异步结果依赖前一个异步”;Promise 的 then 链把它拉平,错误统一走 catch。




