RxJS 中的 switchMap 和 concatMap 有什么不同?

阅读时长 4 分钟读完

背景

RxJS 是一种响应式编程的库,它提供了一些操作符来处理数据流,其中 switchMap 和 concatMap 是比较常用的两个操作符。它们在处理数据流时有着一些不同的特点,下面我们来详细介绍一下这两个操作符。

switchMap

switchMap 在处理数据流时,会接受一个函数作为参数,在这个函数中进行一些异步操作,并返回一个新的 Observable。具体来说,每当源 Observable 发出一个值时,switchMap 就会取消之前的所有未完成的内部 Observables,并创建一个新的内部 Observable 来订阅。换句话说,switchMap 只会发出最新的内部 Observable 发射的值。

下面是一个 switchMap 示例代码:

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

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

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

这段代码中,我们创建了一个源 Observable,它用来监听 document 上的 click 事件。接着我们使用 switchMap 操作符订阅 click 事件,并返回一个新的 Observable,用于监听 document 上的 mousemove 事件。最后再使用 mapTo 操作符将事件的名称修改为 'SwitchMap',输出到控制台中。

concatMap

concatMap 也需要一个函数作为参数,这个函数返回一个 Observable,这个 Observable 会被合并到输出 Observable 中。相对于 switchMap,concatMap 会按照源 Observable 中的顺序订阅和发出值,而不是只取最新的值。

下面是一个 concatMap 示例代码:

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

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

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

同样,我们监听了 document 上的 click 事件,并返回一个新的 Observable 用于监听 document 上的 mousemove 事件,但是使用了 concatMap 操作符,并且在内部 Observable 中使用了 delay 操作符,来延迟 1 秒后发出值。

不同之处

通过这两个示例代码的比较,我们可以看到 switchMap 和 concatMap 的不同之处。在上面的示例中,我们都使用了相同的源 Observable 和内部 Observable,但是在使用不同的操作符后,输出结果截然不同。

对于 switchMap,我们只会输出最新的 'SwitchMap',因为每次源 Observable 发出新的值时,switchMap 就会取消之前的所有内部 Observable,并只取最新的一个。

而对于 concatMap,我们会输出多个 'ConcatMap',因为内部 Observable 的下一个值会等待 1 秒后才会被发出,所以会产生重叠的现象,但是它们的顺序是按照源 Observable 中的顺序依次发出的。

学习和指导意义

switchMap 和 concatMap 并不是互斥的,它们各有优缺点,根据实际需求来选择使用哪一个操作符。通常来说,根据业务场景的需求来决定如何处理内部 Observable 中的值是很重要的。

同时,在学习 RxJS 这个库时,掌握这些操作符的使用方法和特点也是非常重要的。在实际开发中,我们可能会遇到类似的需求,比如在用户输入时进行搜索提示或关联查询等场景,这时候根据需要选择恰当的操作符,能够使我们的代码更加简洁高效。

总结

在本文中,我们对比了 RxJS 中的 switchMap 和 concatMap 两种常用的操作符,并介绍了它们的不同之处。可以通过这篇文章来快速掌握这两种操作符的用法和特点,以及如何根据需求来选择适当的操作符。

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

纠错
反馈