Coursera 笔记

Module 02 · Asynchronous I/O with callback programming异步 I/O 与回调编程

Creating Callback Functions创建回调函数

Coursera ↗

🎵 背景音乐开始
欢迎观看《创建回调函数》课程!完成本视频后,您将能够:

  1. 创建回调函数以拦截 HTTP 方法调用
  2. 理解 Node.js 回调函数的处理逻辑

Node.js 中的异步回调

回调函数的作用

  • Node.js 是一个异步框架,广泛使用回调函数将结果返回给调用函数。
  • 回调函数的参数规范:
    • 错误对象(error)作为回调函数的第一个参数。
    • 如果存在错误,回调函数处理错误;如果没有错误,则继续处理结果。

回调函数的工作流程

  1. 检查错误对象:
  • 如果 error 被定义,则处理错误(例如打印错误消息或关闭网络连接)。
  • 如果没有错误,则处理结果。
  1. 打印结果:
  • 例如,通过 response.end() 将结果输出到浏览器。


回调函数在模块中的传递逻辑

示例场景

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


回调函数的多层传递

回调链中的两层结构

层级 回调函数作用
主应用 处理从模块返回的最终结果或错误。
自定义模块 处理 HTTP 请求的响应消息。

工作流程

  1. 主应用调用模块:
  • 传递回调函数 resultCallback,用于处理最终结果。
  1. 模块调用 HTTP 请求:
  • 模块定义内部回调函数处理 HTTP 响应消息。
  • 在响应完成时,模块调用 resultCallback 将结果传回主应用。

双层回调的工作原理

  1. 主应用的回调函数:
  • 主应用调用模块时,传递一个回调函数,用于处理最终结果。
  • 该回调函数通过模块返回的结果进行进一步操作。
  1. 模块的回调函数:
  • 模块内部调用 http.request() 的回调函数,用于处理 HTTP 响应消息。
  • 在处理完 HTTP 响应后,模块的回调函数调用主应用的回调函数。

代码示例:处理 HTTP 响应的回调

  1. 模块定义
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();
};
  1. 主应用调用模块
const weather = require('./weather');

weather.current((temp_f) => {
    console.log(`当前天气温度为:${temp_f}°F`);
});

回调函数的核心点

回调函数的层级

  • 每一层逻辑都包含一个回调函数:
    • 模块内部:处理 HTTP 请求的响应。
    • 主应用:处理模块返回的最终结果。

错误处理

  • 回调函数始终检查第一个参数是否为错误对象:
    • 定义错误时:处理错误并返回结果。
    • 未定义错误时:继续处理正常的结果。

总结

  1. Node.js 中回调函数的广泛使用:
  • 用于非阻塞操作,将结果返回给调用函数。
  1. 错误优先的回调机制:
  • 回调函数的第一个参数是错误对象,用于错误检查与处理。
  1. 多层回调函数的配合:
  • 模块中的回调函数与主应用的回调函数协同工作,通过调用链传递结果。
  1. 分层结构的逻辑清晰:
  • 主应用调用模块时传递回调函数,模块通过回调函数将结果返回给主应用。

🎉 恭喜您掌握了创建和使用回调函数的关键知识! 🚀