Module 02 · Asynchronous I/O with callback programming异步 I/O 与回调编程
Creating Callback Functions创建回调函数
🎵 背景音乐开始
欢迎观看《创建回调函数》课程!完成本视频后,您将能够:
- 创建回调函数以拦截 HTTP 方法调用
- 理解 Node.js 回调函数的处理逻辑
Node.js 中的异步回调
回调函数的作用
- Node.js 是一个异步框架,广泛使用回调函数将结果返回给调用函数。
- 回调函数的参数规范:
- 错误对象(
error)作为回调函数的第一个参数。

- 如果存在错误,回调函数处理错误;如果没有错误,则继续处理结果。

- 错误对象(
回调函数的工作流程
- 检查错误对象:
- 如果
error被定义,则处理错误(例如打印错误消息或关闭网络连接)。 - 如果没有错误,则处理结果。
- 打印结果:
- 例如,通过
response.end()将结果输出到浏览器。

回调函数在模块中的传递逻辑
示例场景
- 主应用调用模块:
- 主应用通过
weather.current()传递一个回调函数(匿名函数)给模块。
- 模块调用 HTTP 请求:
- 模块通过
http.request()向远程服务器发送请求,并返回控制权给模块。
- 回调函数的传递:
- 模块在收到 HTTP 响应消息后调用模块内部的回调函数。
- 模块内部的回调函数再调用主应用的回调函数,并将结果传递回主应用。




回调函数的多层传递


回调链中的两层结构
| 层级 | 回调函数作用 |
|---|---|
| 主应用 | 处理从模块返回的最终结果或错误。 |
| 自定义模块 | 处理 HTTP 请求的响应消息。 |
工作流程
- 主应用调用模块:
- 传递回调函数
resultCallback,用于处理最终结果。
- 模块调用 HTTP 请求:
- 模块定义内部回调函数处理 HTTP 响应消息。
- 在响应完成时,模块调用
resultCallback将结果传回主应用。
双层回调的工作原理
- 主应用的回调函数:
- 主应用调用模块时,传递一个回调函数,用于处理最终结果。
- 该回调函数通过模块返回的结果进行进一步操作。
- 模块的回调函数:
- 模块内部调用
http.request()的回调函数,用于处理 HTTP 响应消息。 - 在处理完 HTTP 响应后,模块的回调函数调用主应用的回调函数。
代码示例:处理 HTTP 响应的回调




- 模块定义
const http = require('http');
exports.current = function (resultCallback) {
const options = {
hostname: 'api.weather.gov',
path: '/stations/KSFO/observations/latest'
};
const req = http.request(options, (response) => {
let data = '';
response.on('data', (chunk) => {
data += chunk;
});
response.on('end', () => {
const temp_f = JSON.parse(data).temperature.value;
resultCallback(temp_f);
});
});
req.on('error', (err) => {
resultCallback(err);
});
req.end();
};
- 主应用调用模块
const weather = require('./weather');
weather.current((temp_f) => {
console.log(`当前天气温度为:${temp_f}°F`);
});
回调函数的核心点
回调函数的层级
- 每一层逻辑都包含一个回调函数:
- 模块内部:处理 HTTP 请求的响应。
- 主应用:处理模块返回的最终结果。
错误处理
- 回调函数始终检查第一个参数是否为错误对象:
- 定义错误时:处理错误并返回结果。
- 未定义错误时:继续处理正常的结果。
总结
- Node.js 中回调函数的广泛使用:
- 用于非阻塞操作,将结果返回给调用函数。
- 错误优先的回调机制:
- 回调函数的第一个参数是错误对象,用于错误检查与处理。
- 多层回调函数的配合:
- 模块中的回调函数与主应用的回调函数协同工作,通过调用链传递结果。
- 分层结构的逻辑清晰:
- 主应用调用模块时传递回调函数,模块通过回调函数将结果返回给主应用。
🎉 恭喜您掌握了创建和使用回调函数的关键知识! 🚀