Angular2 中 RxJS 的使用详解

阅读时长 7 分钟读完

RxJS 是 Reactive Extensions for JavaScript 的简称,它是一种用于处理异步数据流的库,它的提出来源于微软的 .NET 平台。Angular2采用RxJS作为其核心API之一,使得Angular2的架构更加灵活和易于管理。下面我们将详解Angular2中RxJS的使用。

RxJS入门

在学习RxJS之前,我们需要了解一些基本的概念和术语:

Observable

Observable 可以看作是一个序列,它表示在一段时间内从一个数据源中产生的多个数据项(可以是异步的)。在Angular2中,有许多事件都是以 Observable 的形式发布,例如 HTTP 请求、DOM 事件等等。

Observer

Observer 是一个代表 Observable 订阅者的对象。它定义了 Observable 中要如何发送数据给订阅者的方法,通常包括以下3个回调函数:

  • next: Observable 产生下一个数据项时的回调函数;
  • error: Observable 发生错误时的回调函数;
  • complete: Observable 完成数据项的发送时的回调函数。

Subscription

Subscription 表示 Observable 执行的生命周期,通常由 Observables 上的 subscribe 方法返回。当调用 unsubscribe 方法时,Subscription 会执行清理动作,以避免内存泄漏。

Operator

Operator 是用来操作 Observable 和构建 Observable 链的函数。一般用于转换、组合和过滤 Observable。常见的 Operator 有 map, filter, reduce, take 等等。

RxJS的应用

下面我们将列举几个RxJS在Angular2中的使用场景。

匹配输入事件

TextInput 是一个输入框,当用户在输入框中输入信息时,我们需要通过 RxJS 来处理输入,我们可以监听键盘事件实现。

-- -------------------- ---- -------
------ - --------- - ---- ----------------
------ - ---------- - ---- ------------------
------ --------------------------------

------------
  --------- -----------
  --------- -
    ------ ----------- --
    ----------- ------ ------
  -
--
------ ----- ------------ -
  ------- ------ - ---

  ------------- -
    --- ------ - --------------------------------
    ---------------------------- --------
      ------------------ -------------- -- -
        ----------- - ---------------------------------------
      ---
  -
-

在上述代码中,我们使用了 Observable 中的 fromEvent 方法创建了一个针对 input 事件的 Observable,当用户输入时,输入框会触发该事件,从而将输入框的值保存到了组件的 output 属性上。

实现 HTTP 请求

HTTP 通信是 Ajax 出现以来的一个重要特性,而 Angular2 为我们提供了一个 HttpClientModule 来处理 HTTP 请求。通过 HttpClientModule,我们可以使用 RxJS 中的 Operator 来处理 HTTP 的响应结果。

-- -------------------- ---- -------
------ - --------- - ---- ----------------
------ - ---------- - ---- -----------------------

------------
  --------- -----------
  --------- -
    -----------------
    ----
      --- ----------- ----- -- ----------------------------
    -----
  -
--
------ ----- ------------ -
  ------- -----------

  ------------------- ----- ----------- -
    --------------------------------------------
      --------------------- ---- -- -
        ----------- - -----------------
      ---
  -
-

在上述代码中,我们使用 HttpClientModule 执行了一个 GET 请求,并通过 subscribe 方法订阅了 HTTP 请求的响应结果。在回调函数中我们通过 response.results 获取到了电影列表数据,并赋值给了组件的 movies 属性。

处理复杂场景

RxJS 最强大的地方在于它可以轻松地支持复杂的场景。假设我们需要实现一个自动补全的功能,当用户在输入框中输入信息时,我们需要从服务器获取,携带该关键字的提示列表,通过 RxJS 我们可以像下面一样处理这个复杂场景。

-- -------------------- ---- -------
------ - --------- - ---- ----------------
------ - ---------- - ---- -----------------------
------ - ---------- - ---- ------------------
------ ------------------------
------ ---------------------------------
------ -----------------------------------------
------ ------------------------------

------------
  --------- -----------
  --------- -
    ------ ----------- --
    ----
      --- ----------- ---- -- -------------------
    -----
  -
--
------ ----- ------------ -
  ----- --------------

  ------------------- ----- ----------- -
    --- ------ - --------------------------------
    --- ------ - ---------------------------- --------
      ------------ -------------- -- ---------------------------------------
      ------------------
      ------------------------

    ------------------------ -- ----------------------------------------------
      --------------------- ---- -- -
        --------- - ---------------------
      ---
  -
-

在上述代码中,我们通过 RxJS 创建了一个支持自动补全的组件,当用户在输入框中输入内容时,我们通过 fromEvent 方法获取 Observable,使用 map 和 debounceTime 等 Operator 进行前置处理。使用 switchMap 连接了从 input$ 到 HTTP 请求这两部分的操作,这里我们使用 switchMap 而不是使用一般的 map 方法,是因为每次触发 input$,我们都需要取消上一次的请求,防止请求叠加,造成服务器压力过大。

总结

RxJS 可以处理许多 Angular2 中常见的异步数据流操作,比如:HTTP、事件、定时器等等。对 Angular2 响应式编程的实现是一个必不可少的工具。但是,在使用 RxJS 的途中我们需要学会通过 Operator 和 Observable 的组合使用,以实现不同的场景需求。希望通过本篇文章能让大家更好地理解RxJS在Angular2中的应用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f9c3cff6b2d6eab312b821

纠错
反馈