Rxjs的map和switchMap、mergeMap、concatMap区别

前端工程师在日常开发中,经常使用Rxjs来处理异步操作,其中map是十分常见的一个操作符。而在map的基础上,又衍生了三个常用的操作符:switchMap、mergeMap和concatMap。这三者虽然在表面上看起来很相似,但实际上却有着很大的区别。下面我们将对这几个操作符的用法和区别做一详细的解析。

map操作符

在Rxjs中,map操作符主要用来将一个Observale对象的每一个值都映射成一个新的值。例如下面的代码:

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

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

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

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

上面的代码中,我们创建了一个of类型的Observale对象,其中包含了1、2、3三个数值。然后使用map操作符将每一个数值都乘以2。最终我们会得到一个新的Observable对象,其中包含的数值分别是2、4、6。最后通过subscribe来订阅新的Obervable对象并打印输出。

switchMap操作符

switchMap操作符的作用是将原来的Obervable对象转换成一个新的Observable。在转换的过程中,如果新的Observable发出一个值,那么switchMap就会停止之前的Observable并且将新的Observable发送出来的值传递给订阅者。示例代码如下

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

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

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

上面的代码中,我们对document进行了一个click事件的监听。在每一次click事件发生后,我们都会调用一次fromFetch方法向后端发起一个API请求。该方法返回一个Obervable对象,其中包含了API请求的返回结果。在click事件中,我们使用switchMap方法将这个Obervable对象转换成一个新的Observable。并且在有新的结果返回时,会立即取消之前的请求,并将新的结果传递给下游的订阅者。

mergeMap操作符

mergeMap操作符的作用和switchMap操作符类似,都是将一个Observable对象转换为一个新的Observable。但是在mergeMap中,如果有多个新的Observable同时发射出值,那么它们会被合并为一个Observable并被传递给下游的订阅者。示例代码如下

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

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

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

上面的代码中,我们对一个button进行了一个click事件的监听。在每一次click事件发生后,我们都会调用一次fetch方法向后端发起一个API请求。该方法返回一个Obervable对象,其中包含了API请求的返回结果。在click事件中,我们使用mergeMap方法将这个Obervable对象转换成一个新的Observable。并且在有新的结果返回时,如果此时原来的Observable还没结束,那么新的结果就会被合并成一个Observable。

concatMap操作符

concatMap操作符的作用同样也是将一个Observable对象转换为一个新的Observable。与mergeMap不同的是,在concatMap中,如果原来的Observable还没结束,那么新的Observable就会被放到一个队列中等待之前的Observable结束后再执行。示例代码如下

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

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

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

上面的代码中,我们创建了一个每秒发出一个数字的observable对象。然后在这个observable对象中使用take方法只最多取前三个数字。接着使用concatMap操作符将这个observable对象转换成一个新的observable对象。在新的observable对象中,我们又创建了一个每秒发出一个数字的observable对象。同时这个新的observable对象也只取前三个数字。在这个示例中,使用concatMap操作符确保在新的observable对象开始之前,原来的observable对象必须先结束。

总结

通过上述分析,我们可以发现,虽然在操作符名字上,switchMap、mergeMap和concatMap的开头都是map,但是它们的区别还是很大的。在实际的应用中,合理的使用这几个操作符能够提高代码的性能,并且让代码更加的简洁易懂。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/649cee2348841e98949a0b29


猜你喜欢

  • ES9 中模板字面量的新特性及使用示例

    随着前端技术的不断发展,JavaScript 作为一门基础的编程语言,也不断推陈出新。ES9(ECMAScript 2018)是 JavaScript 标准的第九版,其中新增了一些有趣的新特性。

    1 年前
  • MongoDB 如何防止因硬盘满导致服务停止?

    在使用 MongoDB 时,由于数据量的增长以及硬盘空间的有限,很容易出现硬盘满的情况。一旦硬盘满了,MongoDB 就会停止服务,这会对业务造成重大影响。那么,在使用 MongoDB 的过程中,怎样...

    1 年前
  • Deno 如何调试和测试代码

    简介 Deno是一个基于V8引擎和Rust语言构建的安全的JavaScript/TypeScript运行时。相较于Node.js,Deno不使用npm,而是采用ES模块的方式加载外部模块。

    1 年前
  • TypeScript 入门:如何在 React 项目中使用 TypeScript

    作为一名前端开发者,不断学习新技术是必不可少的。而 TypeScript 正是其中一项值得学习的技术。TypeScript 是 JavaScript 的一个超集,它在静态类型检查和语言层面的特殊特性上...

    1 年前
  • # 如何使用 Mocha + Chai + Cheerio 测试 Node.js 中的 HTML 生成函数

    如何使用 Mocha + Chai + Cheerio 测试 Node.js 中的 HTML 生成函数 在前端开发的过程中,我们经常需要写一些生成 HTML 的函数。

    1 年前
  • 使用 CSS Reset 解决字体大小不一致的问题

    在进行网页开发和设计时,我们经常会遇到字体大小不一致的问题。这主要是因为不同的浏览器对于默认的 HTML 元素样式表现不同所导致的。为了解决这个问题,我们可以使用 CSS Reset。

    1 年前
  • 如何使用 PM2 管理云服务器的 Node.js 应用程序

    在云服务器上部署 Node.js 应用程序时,我们需要考虑到应用程序的稳定性、性能和可靠性。为了更好地管理和监控 Node.js 应用程序,我们可以选择使用 PM2 这个工具。

    1 年前
  • 解决 LESS 中使用 @import 时出现的错误

    LESS 是前端开发中常用的一种样式预处理器,在使用 LESS 的过程中经常会遇到使用 @import 引入样式文件时出现的错误。本文将详细介绍在 LESS 中使用 @import 引入样式文件时出现...

    1 年前
  • Material Design 色彩名单

    Material Design 是 Google 在设计界非常知名的设计语言。它提供了丰富的设计元素,例如按钮、卡片、表格等等,以及鲜明的色彩搭配,给人一种清新简洁的感觉。

    1 年前
  • 工具推荐:使用 Chai 和 JavaScript 测试框架进行前端测试

    在前端开发中,测试是至关重要的一步。正确的测试方法可以极大地提高应用程序的质量和稳定性,避免出现潜在错误和漏洞。本文将介绍 Chai 和 JavaScript 测试框架,在前端测试中的应用以及其相关的...

    1 年前
  • Webpack 优化技巧总结

    Webpack 是前端开发的重要工具之一,它可以将多个模块打包成一个集合的 bundle.js 文件,使得前端开发和部署变得更加简单。但是,Webpack 打包的速度有时候会很慢,这会影响我们的开发效...

    1 年前
  • Cypress 测试框架中的性能测试实现方法

    Cypress 是一种现代化的前端自动化测试框架,它能够帮助开发者自动化地测试 Web 应用程序。Cypress 还提供了一个非常有用的特性,就是能够测试应用程序的性能,帮助开发者了解应用程序的响应时...

    1 年前
  • Jest 测试框架中单元测试和集成测试的区别

    在前端开发中,测试是不可或缺的一个环节。而 Jest 是一个广泛使用的 JavaScript 测试框架,其拥有众多强大的功能,其中单元测试和集成测试是最重要的两类测试方法。

    1 年前
  • 小白也能学会的 ES8 async/await 实战教程

    小白也能学会的 ES8 async/await 实战教程 随着 JavaScript 的发展和应用场景的不断扩大,对于前端工程师而言,对其掌握的技术水平也提出了更高的要求。

    1 年前
  • Headless CMS 在移动端的应用实践

    随着移动端的快速发展,越来越多的网站和应用程序需要支持移动端访问。为了满足这种需求,开发者需要考虑一些新的挑战。其中之一就是如何在移动端上进行内容管理。传统的 CMS 并不能很好地解决这个问题,因为它...

    1 年前
  • PWA 实现中如何处理 App 更新的提示?

    前言 PWA(Progressive Web App)已经成为现在互联网产业中的一个热门话题。作为 Web 技术的一种新形态,PWA 让 Web 应用程序与原生应用程序更加接近,可以实现很多原生应用程...

    1 年前
  • 在使用 Webpack+Gulp+Babel 构建前端工程的时候需要注意哪些问题?

    在使用 Webpack+Gulp+Babel 构建前端工程的时候需要注意哪些问题? 在现代前端应用中,Webpack、Gulp、Babel 已经成为了构建前端工程的主流工具。

    1 年前
  • ES10 中更安全的 JSON.stringify 方法用法

    在前端开发中,我们经常需要处理 JSON 数据。而在数据序列化时,我们通常使用 JSON.stringify() 方法将 JavaScript 对象转换为 JSON 字符串。

    1 年前
  • ECMAScript 2020 中的 Promise.allSettled 方法的使用

    ECMAScript 2020 中的 Promise.allSettled 方法的使用 在 JavaScript 中,Promise 作为一种异步编程的利器,非常常见。

    1 年前
  • Web Components 自定义元素(续):使用 Shadow DOM

    在前一篇文章中,我们介绍了如何创建自定义元素。不过,在实际应用中,我们经常需要隔离自定义元素的样式和内部元素,为此,Web Components 提供了 Shadow DOM 的机制。

    1 年前

相关推荐

    暂无文章