前言

前几篇介绍过了

Creation Operators

Filtering Operators

Join Creation Operators

Error Handling Operators

Transformation Operators

这篇继续介绍 Join Operators

参考

Docs – 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的更多相关文章

  1. Apache Flink 漫谈系列 - JOIN 算子

    聊什么 在<Apache Flink 漫谈系列 - SQL概览>中我们介绍了JOIN算子的语义和基本的使用方式,介绍过程中大家发现Apache Flink在语法语义上是遵循ANSI-SQL ...

  2. RxJS——Operators

    RxJS 的操作符(operators)是最有用的,尽管 Observable 是最基本的.操作符最基本的部分(pieces)就是以申明的方式允许复杂的异步代码组合简化. 什么是操作符? 操作符是函数 ...

  3. RxJS——调度器(Scheduler)

    调度器 什么是调度器?调度器是当开始订阅时,控制通知推送的.它由三个部分组成. 调度是数据结构.它知道怎样在优先级或其他标准去存储和排队运行的任务 调度器是一个执行上下文.它表示任务在何时何地执行(例 ...

  4. rxjs笔记(未完成)

    首先是 Observable 和promise的区别, 1返回值个数,Observable 可以返回0到无数个值. 2.Promise主动推送,控制着"值"何时被 "推送 ...

  5. [HIve - LanguageManual] Join Optimization (不懂)

    Join Optimization Join Optimization Improvements to the Hive Optimizer Star Join Optimization Star S ...

  6. 跟我一起读postgresql源码(十四)——Executor(查询执行模块之——Join节点(下))

    3.HashJoin 节点 postgres=# explain select a.*,b.* from test_dm a join test_dm2 b on a.xxx = b.xxx; QUE ...

  7. [转]linux 下 join命令总结

    转自:http://blog.chinaunix.net/uid-20754793-id-177777.html 有两个文件需要合并,开始写了脚本实现,忽然发现join命令能够完全替代,总结了一下jo ...

  8. [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 ...

  9. .net EF Join 关联表分页查询

    Join中第二个参数和第三个参数即为两张表关联对应的字段 第四个参数new 后面如果不写Model名,系统会自动生成带字段的list类型 IQueryable<Operator> oper ...

  10. RxJS入门2之Rxjs的安装

    RxJS V6.0+ 安装 RxJS 的 import 路径有以下 5 种: 1.创建 Observable 的方法.types.schedulers 和一些工具方法 import { Observa ...

随机推荐

  1. 我不应该用JWT的!

    一.前言 大家好呀,我是summo,之前有自学过Shrio框架,网上一搜就有SpringBoot整合Shrio+ JWT的文章,我是在学习Shrio框架的时候顺带学的JWT.后来我还看见有很多博主专门 ...

  2. 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 ...

  3. Geostudio简单实现边坡安全系数的计算

    Geostudio是加拿大团队开发的用于岩土工程稳定性分析的一款工程软件,里面的安全系数的计算基本都是基于极限平衡法原理进行求解的,SLOPE/W模块用于安全系数的求解.SEEP/W模块考虑渗水作用. ...

  4. .Net4.5及.Net Core2.1下的HttpClient使用详解

    一.HTTP系列演进 方式 说明 HttpWebRequest .NET早期版本,同步方式 WebClient HttpWebRequest的封装简化版,同步方式 HttpClient .NET4.5 ...

  5. Docker 容器数据:持久化

    Docker 容器数据:持久化 每当从镜像创建容器时,它都会创建一个新容器,除了镜像数据之外没有任何数据 意味着如果在提交更改之前删除容器,我们将丢失数据 Docker 应该存在一种将数据的文件系统与 ...

  6. Django 通过自定义context_processors实现自定义tag

    通过自定义context_processors实现自定义tag by:授客 QQ:1033553122 测试环境 Win7 Django 1.11 实践 步骤1 应用根目录下,新建自定义context ...

  7. 解决Sqoop导入导出MySQL数据错位问题

    添加--columns "columns,columns,columns" \可以在hive导入mysql时防止数据错位:

  8. SLF4J2.0.x与Logback1.3.x的绑定变动还是很大的,不要乱点鸳鸯谱

    开心一刻 今天跟我姐聊天 我:我喜欢上了我们公司的一个女同事,她好漂亮,我心动了,怎么办 姐:喜欢一个女孩子不能只看她的外表 我:我知道,还要看她的内在嘛 姐:你想多了,还要看看自己的外表 背景介绍 ...

  9. vue页面加载慢,chunk-vendors.js文件太大

    今天拉取合并了同事的代码后页面加载速度变得非常慢,经过排查发现是因为加载的chunk-vendors.js太大 58m 28s就很离谱 经过同事指导加上百度终于找到解决办法,配置compression ...

  10. 万字干货:从消息流平台Serverless之路,看Serverless标准演进

    摘要:如今,Serverless化已经成为消息流平台发展的新趋势,而如何更好地基于Serverless化的消息流平台进行应用设计和开发,则成为了一个值得思考的问题. 本文分享自华为云社区<900 ...