我的编程空间,编程开发者的网络收藏夹
学习永远不晚

​​​​​​​Rxjs map, mergeMap 和 switchMap 的区别与联系

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

​​​​​​​Rxjs map, mergeMap 和 switchMap 的区别与联系

前言

map、mergeMap 和 switchMap 是 RxJS 中的三个主要运算符,在 SAP Spartacus 开发中有着广泛的使用场景。

map

map 是 Observables 中最常见的运算符。 它的作用与数组中的映射相对相似。 map 接收从 Observable 发出的每个值,对其执行操作并返回一个 Observable(因此 Observable 链可以继续)。

把它想象成一个函数,它将采用原始值和投影。 该函数将投影应用于所述值并在转换后返回它们。

让我们举个例子。 假设我们有一个 Observable 数组。 这个数组是一个 Person 的集合。 一个对象代表每个人,每个人都有自己的名字和喜欢的角色。 我们只对获取所有角色的列表感兴趣。

import { of } from 'rxjs';
import { map } from 'rxjs/operators';
const observable = of([
    {
        name: "Parwinder",
        character: "Calcifer"
    },
    {
        name: "Laure",
        character: "Alchemist"
    },
    {
        name: "Eliu",
        character: "X-Men"
    },
    {
        name: "Robert",
        character: "Link"
    }
]);
observable.pipe(
    map(arr => arr.map(person => person.character)) // loops over objects and returns characters
).subscribe(
    char => console.log(char) // ["Calcifer", "Alchemist", "X-Men", "Link"]
);

mergeMap

mergeMap 是 Observable map 和 mege 的组合。 在实际项目中,经常需要 map 生成多个 Observable。 例如,现在我有一个角色数组,对于每个角色,我想进行后端调用并获取一些信息。

看下面的例子:

import { of, from } from 'rxjs';
import { map } from 'rxjs/operators';
const dummyApi = (character) => { // fake api call function
  return of(`API response for character: ${character}`).pipe(
    delay(1000) // the fake api takes 1 second
  );
}
from(["Calcifer", "Alchemist", "X-Men", "Link"]) // characters I need to get information for
.pipe(
  map(arr => dummyApi(arr)) // generates 4 new Observables
).subscribe( // subscribing Observable (outer) of 4 Observables (inner)
  data => data.subscribe(i => console.log(i)) // subscribing to inner Observables
)

dummyApi 是现实项目中的典型例子:输入某个关键字,返回关键字对应的明细,包裹在一个 Observable 对象里。也就是说,map 投影的输出是一个 Observable,而不是普通对象,因此上面的代码编写了丑陋的嵌套 subscribe 来获取实际值。

使用 mergeMap 后,这个操作符能够自动将 map 返回的 Observable 进行 flatten 操作。使用 map 时丑陋的双重 subscribe 调用消失了。

import { of, from } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
const dummyApi = (character) => {
  return of(`API response for character: ${character}`)..pipe(
    delay(1000)
  );
}
from(["Calcifer", "Alchemist", "X-Men", "Link"])
.pipe(
  mergeMap(arr => dummyApi(arr)) // gets 4 Observable as API response and merges them
).subscribe( // we subscribe to one mapped and merged Observable
  data => console.log(data)
)

switchMap

switchMap 的功能与 mergeMap 的功能相同,但略有不同。 switchMap 将订阅外部 Observable 中的所有内部 Observable,但不会合并内部 Observable。 它改为切换到最新的 Observable 并将其传递给链。

它仍然提供一个 Observable 作为输出,不是通过合并,而是通过仅从最新的 Observable 发出结果的想法。

对于我们的最后一个示例,如果我们使用 switchMap,我们只会从最后一个 Observable 中获取结果。

import { of, from } from 'rxjs';
import { switchMap, delay } from 'rxjs/operators';
const dummyApi = (character) => {
  return of(`API response for character: ${character}`).pipe(
    delay(1000)
  );
}
from(["Calcifer", "Alchemist", "X-Men", "Link"])
.pipe(
  switchMap(arr => dummyApi(arr))
).subscribe(
  data => console.log(data) // API response for character: Link
)

有些场景是 switchMap 擅长的,比如所谓的 typehead.

想象这样一个场景:UI 上有一个输入框,我们在其中根据最终用户输入的内容,向其返回搜索结果。

如果用户打算输入 Chase,开始输入 C,然后触发一个 API 调用。 然后客户继续输入 h,我们就必须再次针对 Ch 调用一次后台 API。 此时,我们之前针对 C 的 API 调用已经毫无用处。 我们应该取消之前的 Observable, 并订阅 Ch 对应的 Observable. 更一般性地说,我们需要切换到最新的 Observable.

import { of, from } from 'rxjs';
import { switchMap, delay } from 'rxjs/operators';
const dummyApi = (character) => {
  return of(`Search result for keyword: ${character}`).pipe(
    delay(1000)
  );
}
from(["C", "Ch", "Cha", "Chas", "Chase"]) // mimic key input in text field
.pipe(
  switchMap(arr => dummyApi(arr))
).subscribe(
  data => console.log(data) // Search result for keyword: Chase
)

到此这篇关于Rxjs map, mergeMap 和 switchMap 的区别与联系的文章就介绍到这了,更多相关Rxjs map与mergeMap 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

​​​​​​​Rxjs map, mergeMap 和 switchMap 的区别与联系

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

map, mergeMap和switchMap的区别是什么

今天小编给大家分享一下map, mergeMap和switchMap的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧
2023-07-02

Centos和Redhat的区别与联系

CentOS的简介CentOS是Community ENTerprise Operating System的简称,我们有很多人叫它社区企业操作系统,不管你怎么叫它,它都是Linux操作系统的一个发行版本。CentOS并不是全新的Linux发
2022-06-05

详谈Array和ArrayList的区别与联系

昨天去了一个java的实习面试,发现有好多java最基础的数据结构对于博主来说反而感到陌生,在面试官问一些常见的例如HashMap这样的数据结构,博主能回答的头头是道,但是在问到Array和ArrayList的区别和联系之后,却让博主一脸懵
2023-05-31

java中volatile和synchronized的区别与联系

java中volatile和synchronized的区别与联系这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两
2023-05-31

云服务器和数据库的区别和联系与区别

云服务器和数据库都是用来存储和处理数据的系统,但它们的区别是很大的。云服务器是一种虚拟服务器,它的功能是让客户机或者用户可以连接到服务器进行数据访问。而数据库则是一个存储着数据的系统,它的作用是用来管理和维护数据,以便于在需要的时候可以从这些数据中提取出有用的信息来支持业务。云服务器可以使用虚拟化技术来提高效率,例如使用云计算平台来减少硬件成本和管理负担。云服务器还可以提供更快的数据访问速度和
2023-10-26

解读Java和JavaScript区别与联系

这篇文章主要介绍了解读Java和JavaScript区别与联系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-22

Session和Cookie之间区别与联系

Session和Cookie是两种不同的机制,但它们都用于在Web应用中存储和传递数据。区别:1. 存储位置:Cookie是存储在客户端(浏览器)中,而Session是存储在服务器端。2. 数据安全性:Cookie可以被客户端修改和篡改,因
2023-08-14

云服务器与云数据库的区别和联系与区别

云服务器和云数据库是两个常见的云计算服务,它们之间有一些区别和联系。云计算是一种按需使用的基础设施服务,它通常使用虚拟机、服务器和存储设备来实现。云计算服务按需提供,企业可以按照需求来选择所需的计算、存储和网络服务,而不需要自己构建基础设施系统。云服务器是云计算服务提供商为客户提供的云主机,它们通常提供高性能计算和存储服务。云服务器的主要功能包括数据存储、容错、负载均衡和弹性扩容等。云服务器
2023-10-26

云服务器与虚拟主机的区别和联系与区别

云服务器与虚拟主机是两个不同的概念,它们的区别和联系如下:存储空间:云服务器通常提供大量的可用空间,用户不需要使用物理服务器提供的存储空间。相反,云服务器可以向用户提供高容量的存储空间,用于存储应用程序或数据。可扩展性:云服务器通常提供可伸缩的架构,允许服务器的数量随着业务需求的增加而动态增长。这有助于降低成本,并增加灵活性和可用性。性能:使用云服务器进行虚拟化可以使服务器的性能得
2023-10-26

云服务器和虚拟主机的区别和联系与区别

云服务器和虚拟主机是两个常用的网站托管平台,它们都提供了虚拟化技术来支持企业或个人将数据存储在公共云中。这两个平台都包括了服务器、存储、网络和其他资源,以提供灵活、安全和可靠的基础设施。云服务器提供了虚拟化的基础设施,允许企业或个人将服务器、存储和其他资源存储在其自身的资源池中,无需购买或租用其他资源。这样,企业或个人可以根据自身需求来配置和管理这些资源,提高了灵活性和效率。另一个区别是云计
2023-10-26

unix和linux的区别与联系是什么

这篇文章主要介绍“unix和linux的区别与联系是什么”,在日常操作中,相信很多人在unix和linux的区别与联系是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”unix和linux的区别与联系是什么
2023-06-14

LR和SVM的联系与区别是什么

这篇文章主要介绍“LR和SVM的联系与区别是什么”,在日常操作中,相信很多人在LR和SVM的联系与区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LR和SVM的联系与区别是什么”的疑惑有所帮助!接下来
2023-06-19

Session和Cookie的区别与联系是什么

Session和Cookie是两种不同的机制,用于在Web应用中保存用户状态信息。区别:1. 存储位置:Cookie存储在客户端(浏览器)中,而Session存储在服务器端。2. 安全性:由于Cookie存储在客户端,所以存在被窃取和篡改的
2023-08-15

JSP和serverlet的区别与联系是什么

JSP(JavaServer Pages)和Servlet(Java Servlet)是Java Web开发中常用的两种技术,有以下区别和联系:区别:1. JSP是一种模板引擎技术,允许在HTML页面中嵌入Java代码,通过在JSP页面中编
2023-08-15

【JAVA】JAVA与C++的区别与联系

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言两方介绍C++JAVA 不同==|Java不支持指针、模板、指针重载、联合等|====|支持析构函数|====|条件编译和包含|
2023-08-16

微软与亚马逊云服务器的区别和联系与区别

微软的Azure是一款基于云的平台,可以让开发人员在云上运行各种应用程序和服务。Azure具有高度的灵活性和可扩展性,可以适应各种不同的业务需求,例如开发、测试、运营和数据分析等。而亚马逊的AWS(AmazonWebServices)是一款基于云的平台,可以为企业提供强大的计算和存储能力,包括数据库、分析工具、存储、消息服务、安全性、容器服务等。AWS也提供了一系列的服务,例如数据分析、机器学习、Web应用程序、托管服务、...
2023-10-27

编程热搜

目录