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

Angular中RxJS怎么映射数据

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Angular中RxJS怎么映射数据

小编给大家分享一下Angular中RxJS怎么映射数据,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Map 数据是程序开发时的一种常见操作。当在代码中使用RxJS来生成数据流时,很可能最终需要一种方法来将数据映射成需要的任何格式。RxJS提供了常规的 map 函数,还有 mergeMapswitchMapconcatMap这样的函数,它们的处理方式略有不同。

map

map操作符是最常见的。对于Observable发出的每个值,都可以应用一个函数来修改数据。返回值将在后台被重新释放为Observable,这样就可以在流中继续使用它。它的工作原理与在数组中使用它的方法非常相似。

不同之处在于,数组将始终只是数组,而在映射时,将获得数组中当前的索引值。对于observable,数据的类型可以是各种类型。这意味着可能需要在 Observable map 函数中做一些额外的操作来获得想要的结果。看下面的例子::

import { of } from "rxjs";
import { map } from "rxjs/operators";

// 创建数据
const data = of([
    {
        brand: "保时捷",
        model: "911"
    },
    {
        brand: "保时捷",
        model: "macan"
    },
    {
        brand: "法拉利",
        model: "458"
    },
    {
        brand: "兰博基尼",
        model: "urus"
    }
]);

// 按照brand model的格式输出,结果:["保时捷 911", "保时捷 macan", "法拉利 458", "兰博基尼 urus"]
data.pipe(map(cars => cars.map(car => `${car.brand} ${car.model}`))).subscribe(cars => console.log(cars));

// 过滤数据,只保留brand为porsche的数据,结果:[{"brand":"保时捷","model":"911"},{"brand":"保时捷","model":"macan"}]
data.pipe(map(cars => cars.filter(car => car.brand === "保时捷"))).subscribe(cars => console.log(cars));

首先用一系列汽车创建了可观察对象。然后订阅这个可观测值2次。

  • 第一次修改数据时,得到了一个由brandmodel字符串连接起来的数组。

  • 第二次修改数据时,得到了一个只有brand保时捷的数组。

在这两个例子中,使用Observable map操作符来修改由Observable发出的数据。返回修改的结果,然后map操作符将结果封装到一个可观察对象中,以便后面可以subscribe

MergeMap

现在假设有这样一个场景,有一个可观察到的对象,它发出一个数组,对于数组中的每一项,都需要从服务器获取数据。

可以通过订阅数组来做到这一点,然后设置一个映射来调用一个处理API调用的函数,订阅其结果。如下:

import { of, from } from "rxjs";
import { map, delay } from "rxjs/operators";

const getData = param => {
    return of(`检索参数: ${param}`).pipe(delay(1000));
};

from([1, 2, 3, 4])
    .pipe(map(param => getData(param)))
    .subscribe(val => console.log(val));

map函数返回getData函数的值。在这种情况下,这是可观测的。但这产生了一个问题:因为现在要处理一个额外的可观测值。

为了进一步阐明这一点:from([1,2,3,4])作为“外部”可观察对象,getData()的结果作为“内部”可观察对象。从理论上讲,必须同时接受外部和内部的可观测数据。可以是这样的:

import { of, from } from "rxjs";
import { map, delay } from "rxjs/operators";

const getData = param => {
    return of(`检索参数: ${param}`).pipe(delay(1000));
};

from([1, 2, 3, 4])
    .pipe(map(param => getData(param)))
    .subscribe(val => val.subscribe(data => console.log(data)));

可以想象,这与必须调用Subscribe两次的理想情况相去甚远。这就是mergeMap发挥作用的地方。MergeMap本质上是mergeAllmap的组合。MergeAll负责订阅“内部”可观察对象,当MergeAll将“内部”可观察对象的值合并为“外部”可观察对象时,不再需要订阅两次。如下:

import { of, from } from "rxjs";
import { map, delay, mergeAll } from "rxjs/operators";

const getData = param => {
    return of(`检索参数: ${param}`).pipe(delay(1000));
};

from([1, 2, 3, 4])
    .pipe(
        map(param => getData(param)),
        mergeAll()
    )
    .subscribe(val => console.log(val));

这已经好多了,mergeMap将是这个问题的最佳解决方案。下面是完整的例子:

import { of, from } from "rxjs";
import { map, mergeMap, delay, mergeAll } from "rxjs/operators";

const getData = param => {
    return of(`检索参数: ${param}`).pipe(delay(1000));
};

// 使用 map
from([1, 2, 3, 4])
    .pipe(map(param => getData(param)))
    .subscribe(val => val.subscribe(data => console.log(data)));

// 使用 map 和 mergeAll
from([1, 2, 3, 4])
    .pipe(
        map(param => getData(param)),
        mergeAll()
    )
    .subscribe(val => console.log(val));

// 使用 mergeMap
from([1, 2, 3, 4])
    .pipe(mergeMap(param => getData(param)))
    .subscribe(val => console.log(val));

SwitchMap

SwitchMap具有类似的行为,它也将订阅内部可观察对象。然而,switchMapswitchAllmap的组合。SwitchAll取消先前的订阅并订阅新订阅。在上面的场景中,想要为“外部”可观察对象数组中的每一项执行API调用,但switchMap并不能很好地工作,因为它将取消前3个订阅,只处理最后一个订阅。这意味着只会得到一个结果。完整的例子可以在这里看到:

import { of, from } from "rxjs";
import { map, delay, switchAll, switchMap } from "rxjs/operators";

const getData = param => {
    return of(`retrieved new data with param ${param}`).pipe(delay(1000));
};

// 使用 a regular map
from([1, 2, 3, 4])
    .pipe(map(param => getData(param)))
    .subscribe(val => val.subscribe(data => console.log(data)));

// 使用 map and switchAll
from([1, 2, 3, 4])
    .pipe(
        map(param => getData(param)),
        switchAll()
    )
    .subscribe(val => console.log(val));

// 使用 switchMap
from([1, 2, 3, 4])
    .pipe(switchMap(param => getData(param)))
    .subscribe(val => console.log(val));

虽然switchMap不适用于当前的场景,但它适用于其他场景。例如,如果将筛选器列表组合到数据流中,并在更改筛选器时执行API调用,那么它将派上用场。如果先前的筛选器更改仍在处理中,而新的更改已经完成,那么它将取消先前的订阅,并在最新的更改上启动新的订阅。这里可以看到一个例子:

import { of, from, BehaviorSubject } from "rxjs";
import { map, delay, switchAll, switchMap } from "rxjs/operators";

const filters = ["brand=porsche", "model=911", "horsepower=389", "color=red"];
const activeFilters = new BehaviorSubject("");

const getData = params => {
    return of(`接收参数: ${params}`).pipe(delay(1000));
};

const applyFilters = () => {
    filters.forEach((filter, index) => {
        let newFilters = activeFilters.value;
        if (index === 0) {
            newFilters = `?${filter}`;
        } else {
            newFilters = `${newFilters}&${filter}`;
        }

        activeFilters.next(newFilters);
    });
};

// 使用 switchMap
activeFilters.pipe(switchMap(param => getData(param))).subscribe(val => console.log(val));

applyFilters();

正如在控制台中看到的,getData只记录一次所有参数。节省了3次API的调用。

ConcatMap

最后一个例子是concatMapconcatMap订阅了内部可观察对象。但与switchMap不同的是,如果有一个新的观察对象进来,它将取消当前观察对象的订阅,concatMap在当前观察对象完成之前不会订阅下一个观察对象。这样做的好处是保持了可观测对象发出信号的顺序。为了演示这个:

import { of, from } from "rxjs";
import { map, delay, mergeMap, concatMap } from "rxjs/operators";

const getData = param => {
    const delayTime = Math.floor(Math.random() * 10000) + 1;
    return of(`接收参数: ${param} and delay: ${delayTime}`).pipe(delay(delayTime));
};

// 使用map
from([1, 2, 3, 4])
    .pipe(map(param => getData(param)))
    .subscribe(val => val.subscribe(data => console.log("map:", data)));

// 使用mergeMap
from([1, 2, 3, 4])
    .pipe(mergeMap(param => getData(param)))
    .subscribe(val => console.log("mergeMap:", val));

// 使用concatMap
from([1, 2, 3, 4])
    .pipe(concatMap(param => getData(param)))
    .subscribe(val => console.log("concatMap:", val));

getData函数的随机延迟在1到10000毫秒之间。通过浏览器日志,可以看到mapmergeMap操作符将记录返回的任何值,而不遵循原始顺序。concatMap记录的值与它们开始时的值相同。

总结

将数据映射到所需的格式是一项常见的任务。RxJS附带了一些非常简洁的操作符,可以很好的完成这项工作。

概括一下:map用于将normal值映射为所需的任何格式。返回值将再次包装在一个可观察对象中,因此可以在数据流中继续使用它。当必须处理一个“内部”观察对象时,使用mergeMapswitchMapconcatMap更容易。如果只是想将数据转成Observable对象,使用mergeMap;如果需要丢弃旧的Observable对象,保留最新的Observable对象,使用switchMap;如果需要将数据转成Observable对象,并且需要保持顺序,则使用concatMap

以上是“Angular中RxJS怎么映射数据”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

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

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

Angular中RxJS怎么映射数据

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

下载Word文档

猜你喜欢

SpringMVC怎么映射请求数据

这篇文章主要介绍了SpringMVC怎么映射请求数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringMVC怎么映射请求数据文章都会有所收获,下面我们一起来看看吧。1.获取参数值1.说明开发中,如何获取
2023-07-02

MySQL怎么实现Scott数据映射

这篇“MySQL怎么实现Scott数据映射”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL怎么实现Scott数据映射
2023-06-29

LINQ映射数据库问题怎么解决

这篇文章主要讲解了“LINQ映射数据库问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ映射数据库问题怎么解决”吧!LINQ映射数据库Linq映射数据库文件中常有 priva
2023-06-17

云服务器怎么映射服务器数据库中

要映射服务器数据库中的服务器数据,可以按照以下步骤进行操作:在云服务提供商的网站上登录。找到对应的账户或者服务的管理页面。点击“连接到远程服务器”按钮,进入到远程服务器的登录页面。在该页面中,你可以输入远程服务器的用户名、密码和安全问题等信息。点击“登录”按钮,登录到远程服务器。在远程服务器上创建数据库。可以直接在远程服务器中创建数据库,也可以使用云计算服务提供商提供的数据库服务。以下是一个示例映射方法...
2023-10-27

云服务器怎么映射服务器数据

要将云服务器的数据映射到本地数据库,您需要使用SQL语句来查询并获取要映射到的数据库中的数据。具体的SQL语句取决于要将数据映射到哪个云服务器。以下是一些常用的SQL语句,可以帮助您完成对云服务器的数据查询:SELECT*FROMdatabase;SELECTstatementFROMtable_name;SELECTstatementFROMdatabaseWHEREtable_na
2023-10-26

jpa怎么映射数据库不存在的字段

在JPA中,可以使用`@Transient`注解来标记一个字段,表示它不需要映射到数据库中。这样,即使数据库中不存在该字段,JPA也不会报错。例如,假设有一个实体类`User`,其中有一个字段`age`需要映射到数据库,而另一个字段`ful
2023-09-13

云服务器怎么映射服务器数据库

要映射服务器数据库,可以使用以下步骤:打开云服务器,并登录到它的管理界面。在数据库视图中,创建需要映射的数据表。数据表应该包含要映射的数据的完整字段和列。在表设计器窗口中,使用createopenalterdrop`export``来创建数据表。在数据表窗口中,使用table标签来选择需要映射的数据表,然后在exportwithclosing_field()和closing_field
2023-10-26

云服务器怎么映射服务器数据的

要将一个云服务器中的数据映射到本地数据库中,可以使用Python中的pandas库。Pandas库可以用于将云服务器中的数据读入本地数据库中。以下是一个使用pandas库的例子:```pythonimportpandasaspd读取云服务器中的数据data=pd.read_csv('example.csv')将数据写入本地数据库writer=data.writer(writer)查
2023-10-26

Linq中怎么映射一个类到数据库中的二维表里

这篇文章主要讲解了“Linq中怎么映射一个类到数据库中的二维表里”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linq中怎么映射一个类到数据库中的二维表里”吧!一.创建一个 Linq 项目1
2023-06-17

更新结构中的映射式数据结构

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《更新结构中的映射式数据结构》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~问
更新结构中的映射式数据结构
2024-04-04

云服务器怎么映射服务器数据库中的文件

云服务器的文件映射云服务器上的文件可以分为本地文件和云端文件。本地文件通常存储在本地数据库中,用户可以使用数据库进行备份和恢复。云端文件则存储在云服务器的数据库中,用户可以使用数据库进行备份和恢复。云服务器的本地文件映射可以使用数据库中的文件映射表来实现。在这种映射方法下,用户需要创建一个映射表,将本地文件和云端文件进
云服务器怎么映射服务器数据库中的文件
2023-10-28

Python映射类型中dict怎么用

这篇文章给大家分享的是有关Python映射类型中dict怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。映射类型 - dict字典可用多种方式来创建:使用花括号内以逗号分隔键: 值对的方式: {‘
2023-06-29

docker中怎么修改端口映射

要修改Docker容器的端口映射,可以通过以下两种方式实现:在运行容器时指定新的端口映射:可以使用 -p 参数来指定容器的端口映射,格式为-p [host_port]:[container_port]。例如,要将主机的端口8080映射到容
docker中怎么修改端口映射
2024-03-06

MyBatis中怎么进行结果映射

MyBatis中结果映射是通过配置Mapper XML文件中的resultMap来实现的。在resultMap中定义了数据库列和Java对象属性之间的映射关系。以下是一个简单的示例:假设有一个数据库表user,包含字段id和name,对
MyBatis中怎么进行结果映射
2024-04-08

云服务器怎么映射服务器信息的数据

云服务器可以通过以下方式映射数据:将数据存储在云服务器上。将数据从云服务器中传输到本地磁盘或其他存储设备上。使用云服务器的网络功能,将数据从一个位置传输到另一个位置。通过使用云服务器中的数据库和存储设备,用户可以方便地存储、检索和分析数据。这些数据可以通过网络、数据库、API等方式进行访问和处理,从而实现高效的数据管理和分析。但是,在使用云服务器的同时,用户需要注意一些安全问题。例如,需要设置密码...
2023-10-27

云服务器怎么映射服务器数据的存储

云服务器可以通过以下几种方式来存储数据:数据库:云服务器通常使用关系型数据库来存储数据。可以将数据库连接复制到云服务器本地或远程数据中心的任何位置。集群存储:云服务器可以通过多个服务器集群来存储大量数据。可以将多个服务器组成群集来存储数据,并通过负载均衡等技术来保证群集中的数据的一致性和可用性。缓存:云服务器可以通过缓存来减轻数据库查询和处理负载,缓存可以根据需要来定时或实时更新数据。这种方式可以避免频...
2023-10-27

云服务器怎么映射服务器数据的文件

要将服务器上的数据映射到本地磁盘上的文件,可以使用以下步骤:在云服务器上创建一个映射文件。在要映射的文件上使用Export命令将其指定为要映射的磁盘分区。例如,在命令行中使用FileExport命令来指定要映射到哪个磁盘分区。确保将所有文件映射到磁盘分区的SAFE扩展名,例如.EXE。在映射文件中添加需要访问的文件或目录路径。如果需要访问的文件或目录没有路径,则可以使用ExportAll命令来指定所有相关文件或目录的路径。...
2023-10-27

编程热搜

目录