全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-15 7 分钟 ✍️ juanwangdev

Node.js 异步回调

异步回调是 Node.js 处理 I/O 操作的核心方式,理解回调模式是掌握异步编程的第一步。

回调函数基础

回调函数是作为参数传入的函数,在异步操作完成后被调用。

JavaScript
// 同步读取(阻塞)
const data = fs.readFileSync('file.txt', 'utf8');
console.log(data);

// 异步读取(非阻塞)
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
console.log('继续执行其他代码');

回调函数规范

Node.js 回调函数遵循 Error-First 原则:

JavaScript
function asyncOperation(callback) {
  // 成功时
  callback(null, result);

  // 失败时
  callback(new Error('操作失败'));
}

// 使用
asyncOperation((err, result) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(result);
});

回调地狱问题

多层嵌套的回调导致代码难以维护:

JavaScript
fs.readFile('file1.txt', 'utf8', (err, data1) => {
  if (err) throw err;
  fs.readFile('file2.txt', 'utf8', (err, data2) => {
    if (err) throw err;
    fs.readFile('file3.txt', 'utf8', (err, data3) => {
      if (err) throw err;
      console.log(data1, data2, data3);
    });
  });
});

解决方案

拆分函数

JavaScript
function readFile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, 'utf8', (err, data) => {
      err ? reject(err) : resolve(data);
    });
  });
}

// 使用 async/await
async function readFiles() {
  const data1 = await readFile('file1.txt');
  const data2 = await readFile('file2.txt');
  const data3 = await readFile('file3.txt');
  return [data1, data2, data3];
}

推荐使用 Promise 和 async/await 替代深层嵌套回调。

要点总结

  • Node.js 回调遵循 Error-First 原则(错误优先)
  • 回调地狱由多层嵌套导致,代码难以阅读和维护
  • 使用 Promise + async/await 解决回调地狱问题
  • 将回调封装为 Promise 是现代化改造的常用手段

📝 发现内容有误?点击此处直接编辑

← 上一篇 Node.js 事件循环机制
下一篇 → Node.js 监听与触发事件
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库