RxJS 中使用 takeUntil 运算符优雅地取消 Observable 订阅

阅读时长 4 分钟读完

在前端开发中,我们经常会用到 RxJS 这个响应式编程库,它可以帮助我们更加优雅地处理异步数据流。但是,在使用 RxJS 订阅 Observable 时,我们也经常遇到需要取消订阅的情况,否则就会导致内存泄露。而 RxJS 中的 takeUntil 运算符就是一个方便而优雅的解决方案。

takeUntil 运算符介绍

takeUntil 运算符的作用非常简单,就是在一个 Observable 发出指定的值之前,一直订阅源 Observable。当 takeUntil 的参数 Observable 发出值时,原始 Observable 的订阅就自动取消了。

下面是一个简单的示例代码:

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

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

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

以上代码中,我们创建了一个每秒发出一次递增值的 Observable source$,并使用 fromEvent 创建一个点击事件的 Observable stop$。然后,我们通过 takeUntil 运算符将 source$stop$ 发出值时停止订阅,并在每次 source$ 发出值时打印出该值。

使用 takeUntil 运算符避免内存泄露

在实际开发中,如果我们不手动取消原始 Observable 的订阅,就会导致内存泄露。而使用 takeUntil 运算符,我们可以避免这种情况的发生。

以下是一个实际的例子,假设我们正在开发一个搜索页面,在每次输入框发生变化时发送一个 Ajax 请求,然后将结果展示在页面上。代码大致如下:

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

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

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

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

以上代码看起来没有什么问题,但实际上它有一个很严重的问题。如果用户频繁输入,就会导致多次 Ajax 请求并行发起。而如果上一次请求还没有返回,下一次请求又开始了,就会导致结果错乱,用户体验非常糟糕。

为了避免这种情况,我们需要在每次新的输入事件发生时,取消上一次请求的订阅。这可以使用 takeUntil 运算符来实现,示例代码如下:

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

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

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

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

以上代码中,我们通过 fromEvent(searchInput, 'blur') 创建了一个 Observable,当搜索框失去焦点时这个 Observable 发出一个值,即代表用户已经停止输入。我们使用 takeUntil 运算符将每次 input 事件的订阅在 blur 事件发生时取消。这样一来,就可以确保每次只有最后一次输入事件发起 Ajax 请求。

总结

使用 RxJS 中的 takeUntil 运算符,可以帮助我们避免订阅 Observable 时的内存泄露问题,并提供一种优雅的方式来取消订阅。我们可以在订阅 Observable 时通过配合使用 takeUntil 运算符来实现更加复杂的数据流控制流程,从而提升代码的可读性和维护性。

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

纠错
反馈