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 是现代化改造的常用手段
📝 发现内容有误?点击此处直接编辑