Node.js 词条目录
前端Wiki/Node.js/深入/异步编程与错误处理

回调与回调地狱

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。