前言

前几篇介绍过了

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. PixiJS源码分析系列: 第一章 从最简单的例子入手

    从最简单的例子入手分析 PixiJS 源码 我一般是以使用角度作为切入点查看分析源码,例子中用到什么类,什么方法,再入源码. 高屋建瓴的角度咱也做不到啊,毕竟水平有限 pixijs 的源码之前折腾了半 ...

  2. [oeasy]python0093_电子游戏起源_视频游戏_达特茅斯_Basic_家酿俱乐部

    编码进化 回忆上次内容 Ed Robert 的 创业之路 从 售卖 diy 组装配件 到进军 计算器市场 最后 发布 牛郎星8800 intel 8080 的出现 让 人人都有 自己的 个人电脑 Bi ...

  3. 学习笔记--Java中final关键字

    Java中final关键字 关于Java语言中的final关键字: final是一个关键字,表示:最终的,不可改变 final修饰的类无法被继承 final修饰的方法无法被覆盖 final修饰的变量一 ...

  4. Known框架实战演练——进销存框架搭建

    本文介绍如何使用Known开发框架搭建进销存管理系统的项目结构,以及开发前的一些配置和基础代码. 项目代码:JxcLite 开源地址: https://gitee.com/known/JxcLite ...

  5. 《Programming from the Ground Up》阅读笔记:p75-p87

    <Programming from the Ground Up>学习第4天,p75-p87总结,总计13页. 一.技术总结 1.persistent data p75, Data whic ...

  6. 深度解读GaussDB(for MySQL)与MySQL的COUNT查询并行优化策略

    本文分享自华为云社区<[华为云MySQL技术专栏]GaussDB(for MySQL)与MySQL的COUNT查询并行优化策略>,作者:GaussDB 数据库. 1.背景介绍 统计表的行数 ...

  7. 假期小结1学习安装VMware以及linux

    学习VMware是一项使我能够创建和管理虚拟机的技能.VMware 是一家知名的虚拟化解决方案供应商,它提供了一系列工具和软件,使我能够在一台物理计算机上创建多个独立的虚拟环境. 首先,我获取了VMw ...

  8. Docker镜像构建:技术深度解析与实践指南

    本文深入分析了Docker镜像构建的技术细节,从基础概念到高级技术,涵盖了多阶段构建.安全性优化.性能提升及实战案例.旨在为专业人士提供全面的技术洞察和实用指导,以提升Docker镜像构建的效率和安全 ...

  9. docker无法安装而需要的换源需求

    docker无法安装镜像而需要的换源需求: 报错信息 (超时连接) 第一步: 登录阿里云:https://www.aliyun.com/ 第二步: 进入阿里云镜像加速: 点击"控制台&quo ...

  10. 【Git】03 撤销 & 版本回退

    回退分为三种情况,每种情况对应了我们文件的存储区域 工作区 | 暂存区 | 版本区(当前分支) 1.文件可能存放在工作区,没有被Git追踪[红色标记状态] 2.文件可能已经添加到暂存区,没有被Git提 ...