Skip to content

可观察对象 (Observable) 与订阅者 (Subscriber) 的关系

可观察对象(Observable) —— 产生数据流

      | 订阅(subscribe)

订阅者(Subscriber) —— 接收并处理数据

      | 实现

数据观察者(Observer) —— 定义如何处理数据的接口

核心概念解析

  1. Observer(观察者)
    定义了一套处理数据的回调接口,作为参数传递给 Observable 对象。

    ts
    {
      next: (value) => { /* 数据到达时的回调 */ },
      error: (err) => { /* 错误发生时的回调 */ },
      complete: () => { /* 数据流结束时的回调 */ }
    }
  2. Observable(可观察对象)

    • 通过 new 工厂化创建可观察数据流对象,将数据生产逻辑(如 AJAX 请求、定时器、事件监听等)封装在独立的上下文中。
    • 只有被订阅时才会执行。
    • 支持管道化操作(通过 pipe 转换为新的 Observable 对象)。
  3. Subscription(订阅)

    • 调用 Observablesubscribe 方法,传入 Observer 对象来处理各种情况。
    • 作用是控制数据流的生命周期。

NestJS SSE 推送流程极简总结 📝

“你管流,NestJS 管推”

  1. 你返回一个 Observable<{ data: T }>
    (例如 interval(1000).pipe(map(...)) 生成数据流)。

  2. NestJS 的 @Sse() 自动处理

    • 设置响应头 Content-Type: text/event-stream
    • 订阅你的 Observable,监听数据发射。
  3. 数据转换规则:
    每次 Observable 发射 { data: T } 时,NestJS 将其转为:

    data: <JSON.stringify({ data: T })>\n\n

    并通过 HTTP 流式推送。

  4. 客户端(如浏览器)通过 EventSource 接收
    解析为 e.data