RxJs高阶运算——exhaustMap

选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。

上一节我们介绍了switchMap的特点,只要一个新的Source Observable到来,我们就订阅新的Observable,那么可能会有另一种情况就是,我们订阅第一个Source Observable,只有当这个Observable都完成的时候,如果之前有新的Observable到来,我们都忽略,这种情况就是我们今天介绍的exhaustMap.

为了学习exhaustMap,我们先得理解Exhaust的原理。

ExhaustMap

Exhaust弹珠图

我们先来看看exhaust的弹珠图

 

RxJs Exhaust Strategy

弹珠图分析

就像之前一样,我们在第一行有一个高阶 Observable,其值本身就是 Observable,从第一行分叉。以下是此图中发生的情况:

1、就像 switch 的情况一样,exhaust 订阅了第一个内部 Observable (a-b-c)

2、像往常一样,值 a、b 和 c 会立即反映在输出中

3、然后发出第二个内部 Observable (d-e-f),而第一个 Observable (a-b-c) 仍在进行中

4、这第二个 Observable 被耗尽策略丢弃,并且不会被订阅(这是耗尽的关键部分)

5、只有在第一个 Observable (a-b-c) 完成后,耗尽策略才会订阅新的 Observable

6、当第三个 Observable (g-h-i) 发出时,第一个 Observable (a-b-c) 已经完成,所以这第三个 Observable 不会被丢弃,会被订阅

7、然后第三个 Observable 的值 g-h-i 将显示在结果 Observable 的输出中,这与输出中不存在的值 d-e-f 不同

 

就像 concat、merge 和 switch 的情况一样,我们现在可以在高阶映射的上下文中应用exhaust策略。

 

RxJs ExhaustMap操作符

现在让我们看一下exhaustMap 算子的弹珠图。让我们记住,与上图的第一行不同,源 Observable 1-3-5 发出的值不是 Observables

exhaustMap弹珠图

RxJs exhaustMap Example

exhaustMap弹珠图分析

1、值 1 被发出,并创建了一个内部 Observable 10-10-10

2、Observable 10-10-10 发出所有值并在源 Observable 中发出值 3 之前完成,因此在输出中发出的所有 10-10-10 值

3、在输入中发出一个新值 3,触发一个新的 30-30-30 内部 Observable

4、但是现在,当 30-30-30 仍在运行时,我们在源 Observable 中得到了一个新值 5

5、这个值 5 被耗尽策略丢弃,这意味着从未创建过 50-50-50 Observable,因此 50-50-50 值从未出现在输出中

好了,这里通过描述和图示大概分析了exhaustMap的原理。欢迎参与讨论。

使用场景:

当您的系统可以产生多个触发长期任务的操作时,exhausMap 很有用,例如登录 HTTP 请求,并且在当前任务完成之前应该忽略所有其他类似的操作。

 

版权声明:著作权归作者所有。

相关推荐

禁止UITableView选中高亮显示

去掉UITableViewCell的Selection style即可Objective-Ccell.selectionStyle = UITableViewCellSelectionStyleNone; 或者[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; Swift 2cel

iOS11固定UISearchBar在导航栏的高度

iOS 11重新设计了UISearchBar,四个角改为圆角,高度变大。在导航栏添加搜索框可能会导致导航栏高度变大,所以有必要固定UISearchBar的高度。固定搜索栏的高度为44let searchBar = UISearchBar()  //配置searchBar相关代码 navigationItem.titleView =&nbs

Kotlin实现Java的三元条件运算

在Kotlin没有类似Java的三元条件运算:a ? b : c 在Kotlin有几种等效的方法:ifval r =if (a) b else c whenval r = when(a) {     true 

Python : 数值以及数值运算

数值类型Python的数值类型包括:整数int ,浮点数float和复数。其他的数值类型包括:Decimal和分数Fraction。int:整数不限精度float:Python里的浮点数使用C语言的double实现,其精度由运行的系统决定,可以使用sys.float_info查看精度信息。复数:复数的虚数部分有j或J表示,如1+2j。其中实数和虚数的数值部分使用浮点数表示,它们可以使用z

C#计算用户年龄

此方法仅用于简单计算年龄,不适用于计算虚岁public static int GetAge(DateTime birthDate) {     DateTime now = DateTime.Now;      int age&n

JavaScript ES6扩展运算符(...)用例

ES6新增了扩展运算符,它的语法很简单,使用三个点号表示“...”。它的作用是把数组展开为类似用逗号隔开的参数列表。这里介绍几种用例来理解扩展运算符的使用。用例1:插入数组如果我们要在一个数组插入另外一个数组的元素,可以结合splice和apply使用,如:a1 = [1,2,5,6,7]; a2 = [3,4]; a1.splice.apply(a1,&n

Rxjs expand的用法分析

Rxjs的expand()函数声明:public expand(project: function(value: T, index: number), concurrent: number, scheduler: Scheduler): Observable expand()会递归调用project函数,project函数把源值映射为一个Observable,每次递归

Swift禁止UITableView选中高亮

禁止UITableView选中高亮,可以对UITableViewCell实例设置样式:Swift 2cell.selectionStyle = UITableViewCellSelectionStyle.None Swift 3cell.selectionStyle = .none

运行PowerShell脚本.ps1

在PowerShell执行脚本1、打开Windows PowerShell2、进入脚本所在的文件夹PS> cd C:\topath\3、执行powershell脚本PS> .\myscript.ps1 在CMD执行脚本powershell -noexit "& ""C:\topath\myscript.ps1"""快捷执行在脚本文件.ps1点击右键,然后点击 “使用P

CKEditor 5设置编辑器高度

CKEditor 5提供的几种编辑器,它们的高度是随着内容变化的,官方没有提供设置编辑器高度的参数配置。如果要给编辑器固定高度有以下两种做法。对于经典版(classic editor build),可以通过CSS:.ck-editor__editable_inline {  height: 200px;}对于所有版本,可以通过js来设置:editor.editing.view.chang