Coursera 笔记

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

Asynchronous I/O with Callback Programming异步 I/O 与回调编程概述

Coursera ↗

🎵 背景音乐开始
欢迎观看《异步 I/O 与回调编程》课程!完成本视频后,您将能够:

  1. 解释异步回调函数的概念
  2. 处理服务器资源的 HTTP 方法调用

异步 I/O 的概念

网络操作的异步特性

  • 网络操作通常是异步的,例如:从 Web 服务调用的响应可能不会立即返回。
  • 如果应用程序阻塞等待网络操作完成,服务器将浪费处理时间。

Node.js 的非阻塞机制

  • 所有网络操作都是非阻塞的:每个操作都会立即返回一个结果,而无需等待完成。
  • 当网络操作完成时,Node.js 会调用您定义的回调函数来处理结果。

异步流程示例

以下是 Node.js 处理 HTTP 请求的流程图:

  1. 发起 HTTP 请求:
  • 调用 HTTP.request 函数向远程 Web 服务器发送请求。
  • Node.js 框架立即返回结果:此结果仅表示请求已成功发送,而不包含响应消息。
  1. 等待响应:
  • 当远程服务器返回 HTTP 响应消息时,Node.js 框架会调用定义在 HTTP.request 函数中的回调函数。
  1. 回调处理响应:
  • 回调函数处理响应消息,例如解析响应体或打印日志。

复杂场景:自定义模块中的 HTTP 请求

  1. 应用程序调用自定义模块中的导出函数。
  2. 模块通过 HTTP.request 向远程服务器发送请求,并立即返回结果。
  3. 应用程序在等待响应的同时继续处理其他操作。
  4. 远程服务器返回响应时,Node.js 框架调用模块内定义的回调函数。


HTTP 请求的实现代码

以下是一个使用 HTTP.request 发送请求并处理响应的示例:

步骤 1:定义请求选项

const options = {
    hostname: 'api.weather.gov',
    path: '/stations/KSFO/observations/latest',
    method: 'GET'
};
  • hostname:远程服务器的主机名。
  • path:要操作的 URL 资源路径。
  • method:请求方法(如 GET、POST 等)。

步骤 2:发送请求

const http = require('http');

const req = http.request(options, (res) => {
    let data = '';
    
    // 监听 'data' 事件,接收数据块
    res.on('data', (chunk) => {
        data += chunk;
    });

    // 监听 'end' 事件,处理完成后的操作
    res.on('end', () => {
        console.log(data);
    });
});

// 监听 'error' 事件,处理错误
req.on('error', (err) => {
    console.error(`Request error: ${err.message}`);
});

// 结束请求
req.end();

HTTP 请求的参数与方法

HTTP 请求的参数

参数 描述
hostname 远程服务器的主机名,例如 api.weather.gov
path URL 的资源路径,例如 /stations/KSFO/...
protocol 协议(http 或 https)
headers HTTP 请求头

重要方法

方法 描述
object.on() 监听事件(例如 data、end、error、close)。
clientRequest.end() 结束请求并发送数据到服务器。

事件与回调函数

事件类型 触发条件 描述
data 数据块到达时触发 处理接收到的数据块
end 响应完成时触发 处理最终的完整响应
error 请求失败时触发 捕获并处理错误
close 连接关闭时触发 清理资源

回调函数的作用

  • request.on('data'):当收到部分数据时调用,用于累积数据块。
  • request.on('end'):当接收数据完成时调用,用于处理完整数据。
  • 错误处理:
    • 如果发生错误,error 事件会被触发。
    • 调用 req.on('error') 捕获并记录错误信息。


总结

  1. 异步 I/O 的优势:
  • 非阻塞:网络操作立即返回结果,应用程序不会因等待而浪费处理时间。
  1. 回调函数的使用:
  • Node.js 在接收到 HTTP 响应消息后调用回调函数,处理响应数据。
  1. 事件监听:
  • 通过 object.on() 监听 data、end、error 等事件,处理响应的不同阶段。

🎉 恭喜您掌握了异步 I/O 与回调编程的核心概念和基本实现方法! 🚀