RxJS 系列 – Join Operators
前言
前几篇介绍过了
这篇继续介绍 Join Operators
参考

concatAll, mergeAll, switchAll, exhaustAll
参考: RxJS 組合類型 Operators (1) - switchAll / concatAll / mergeAll / combineAll / startWith
请先学习 concatMap, mergeMap, switchMap, exhaustMap 哦
这里只介绍 concatAll, 主要是讲那个 All 的概念, 其余的只是换成 merge ,swtich, exhaust 概念而已.
concat 的 Observables 是一开始就定义好, 知道数量的 (o1, o2, o3) 3 个 Observables
concat(o1, o2, o3)
concatMap
from([1, 2, 3]).pipe(concatMap(v => of(v)));
concatMap 是接收 value 返回 Observable, 它的数量是动态的, 可以一直增加. 每当原 source 发布, concat 的 Observables 就多一个
concatAll 和 concatMap 类似, 只是它放在后面
from([1, 2, 3]).pipe(map(v => of(v), concatAll()));
concatMap 是返回 Observable
concatAll 则是接收 Observable (必须是 Observable). 上面的例子和 concatMap 的例子实现的效果是一样的.
所以其实只是提供 Observable 的方式改变了. 它的目的主要是在管理, 因为有时候 Observable 的提供时机不容易控制. 所以 RxJS 支持前后 2 钟方式提供 Observable 就方便多了.
combineLatestAll
它这个 All 的概念和 concatAll 的 All 是一样的. 就是提供 Observable 的方式换了
combineLatest([
interval(1000).pipe(map(v => `a${v}`)),
interval(2000).pipe(map(v => `b${v}`)),
]).subscribe(v => {
console.log(v);
}); const s1 = new Subject<Observable<string>>();
s1.pipe(combineLatestAll()).subscribe(v => {
console.log(v);
}); s1.next(interval(1000).pipe(map(v => `a${v}`)));
s1.next(interval(2000).pipe(map(v => `b${v}`)));
s1.complete(); // 要 complete 了 combineLatestAll 才会接收哦
上面这 2 个效果是一样的.
combineLatest 参数直接接收所有 Observables
combineLatestAll 是通过 subscribe source 获取 Observables 然后调用 combineLatest. 但它也必须等到 source complete 了才会调用 combineLatest 哦.
startWith
startWith 的功能是通过 pipe 插入一个初始值.
const obs = new Observable(subscruber => {
// 没有任何发布
});
obs.pipe(startWith('default value')).subscribe(v => console.log(v)); // default value
subscribe 会立刻接收到 default value 即便 Observable init 内并没有任何发布.
上一篇有介绍过 pairwise

通过 startWith 我们可以补上一个 default value, 这样就不会总是少一次接收了.
const obs = from([1, 2, 3, 4]);
obs.pipe(startWith(null), pairwise()).subscribe(v => console.log(v)); // [null, 1]..[1,2]..[2,3]..[3,4]
withLatestFrom
withLatestFrom 和 combineLatest 差不多. 只是发布时机不同.
combineLatest 是当任何一个 Observable 发布时就发布所有值
withLatestFrom 则通过一个独立的 notification source 来确定发布时机.
const click$ = fromEvent(document, 'click');
const source$ = interval(1000);
const source2$ = interval(2000);
click$.pipe(withLatestFrom(source$, source2$)).subscribe(v => console.log(v));
withLatestFrom(source$, source2$) 和 combineLatest(o1, o2) 是一样的调用手法
只是 withLatestFrom 发布的时机变成了 click$ 发布的时候. 每一次点击就会接接收到所有 Observables 最新的值.
一句话总结
concatAll, mergeAll, switchAll, exhaustAll : concatMap 是通过返回 Observable 这个方式来提供 Observable 给 concat, concatAll 则是通过接收 Observable 来提供 Observable 给 concat. 所以只是提供 Observable 的方式不同.
combineLatestAll : 通过 subscribe source 获取 Observables, source 必须 complete 哦
startWith : 通过 pipe 插入初始化 value
withLatestFrom : 通过 notification source 控制发布时机
RxJS 系列 – Join Operators的更多相关文章
- Apache Flink 漫谈系列 - JOIN 算子
聊什么 在<Apache Flink 漫谈系列 - SQL概览>中我们介绍了JOIN算子的语义和基本的使用方式,介绍过程中大家发现Apache Flink在语法语义上是遵循ANSI-SQL ...
- RxJS——Operators
RxJS 的操作符(operators)是最有用的,尽管 Observable 是最基本的.操作符最基本的部分(pieces)就是以申明的方式允许复杂的异步代码组合简化. 什么是操作符? 操作符是函数 ...
- RxJS——调度器(Scheduler)
调度器 什么是调度器?调度器是当开始订阅时,控制通知推送的.它由三个部分组成. 调度是数据结构.它知道怎样在优先级或其他标准去存储和排队运行的任务 调度器是一个执行上下文.它表示任务在何时何地执行(例 ...
- rxjs笔记(未完成)
首先是 Observable 和promise的区别, 1返回值个数,Observable 可以返回0到无数个值. 2.Promise主动推送,控制着"值"何时被 "推送 ...
- [HIve - LanguageManual] Join Optimization (不懂)
Join Optimization Join Optimization Improvements to the Hive Optimizer Star Join Optimization Star S ...
- 跟我一起读postgresql源码(十四)——Executor(查询执行模块之——Join节点(下))
3.HashJoin 节点 postgres=# explain select a.*,b.* from test_dm a join test_dm2 b on a.xxx = b.xxx; QUE ...
- [转]linux 下 join命令总结
转自:http://blog.chinaunix.net/uid-20754793-id-177777.html 有两个文件需要合并,开始写了脚本实现,忽然发现join命令能够完全替代,总结了一下jo ...
- [RxJS] Split an RxJS observable with window
Mapping the values of an observable to many inner observables is not the only way to create a higher ...
- .net EF Join 关联表分页查询
Join中第二个参数和第三个参数即为两张表关联对应的字段 第四个参数new 后面如果不写Model名,系统会自动生成带字段的list类型 IQueryable<Operator> oper ...
- RxJS入门2之Rxjs的安装
RxJS V6.0+ 安装 RxJS 的 import 路径有以下 5 种: 1.创建 Observable 的方法.types.schedulers 和一些工具方法 import { Observa ...
随机推荐
- 我不应该用JWT的!
一.前言 大家好呀,我是summo,之前有自学过Shrio框架,网上一搜就有SpringBoot整合Shrio+ JWT的文章,我是在学习Shrio框架的时候顺带学的JWT.后来我还看见有很多博主专门 ...
- Doris failed to initialize storage reader. tablet=106408, res=[NOT_IMPLEMENTED_ERROR]to be implemented
Apache Doris 2.3 以下的版本会存在一个 bug,导致数据在合并时存在异常,在后续查询该字段数据时会提示 [1105] [HY000]: errCode = 2, detailMessa ...
- Geostudio简单实现边坡安全系数的计算
Geostudio是加拿大团队开发的用于岩土工程稳定性分析的一款工程软件,里面的安全系数的计算基本都是基于极限平衡法原理进行求解的,SLOPE/W模块用于安全系数的求解.SEEP/W模块考虑渗水作用. ...
- .Net4.5及.Net Core2.1下的HttpClient使用详解
一.HTTP系列演进 方式 说明 HttpWebRequest .NET早期版本,同步方式 WebClient HttpWebRequest的封装简化版,同步方式 HttpClient .NET4.5 ...
- Docker 容器数据:持久化
Docker 容器数据:持久化 每当从镜像创建容器时,它都会创建一个新容器,除了镜像数据之外没有任何数据 意味着如果在提交更改之前删除容器,我们将丢失数据 Docker 应该存在一种将数据的文件系统与 ...
- Django 通过自定义context_processors实现自定义tag
通过自定义context_processors实现自定义tag by:授客 QQ:1033553122 测试环境 Win7 Django 1.11 实践 步骤1 应用根目录下,新建自定义context ...
- 解决Sqoop导入导出MySQL数据错位问题
添加--columns "columns,columns,columns" \可以在hive导入mysql时防止数据错位:
- SLF4J2.0.x与Logback1.3.x的绑定变动还是很大的,不要乱点鸳鸯谱
开心一刻 今天跟我姐聊天 我:我喜欢上了我们公司的一个女同事,她好漂亮,我心动了,怎么办 姐:喜欢一个女孩子不能只看她的外表 我:我知道,还要看她的内在嘛 姐:你想多了,还要看看自己的外表 背景介绍 ...
- vue页面加载慢,chunk-vendors.js文件太大
今天拉取合并了同事的代码后页面加载速度变得非常慢,经过排查发现是因为加载的chunk-vendors.js太大 58m 28s就很离谱 经过同事指导加上百度终于找到解决办法,配置compression ...
- 万字干货:从消息流平台Serverless之路,看Serverless标准演进
摘要:如今,Serverless化已经成为消息流平台发展的新趋势,而如何更好地基于Serverless化的消息流平台进行应用设计和开发,则成为了一个值得思考的问题. 本文分享自华为云社区<900 ...