前言

前几篇介绍过了

Creation Operators

Filtering Operators

Join Creation Operators

Error Handling Operators

Transformation Operators

Join Operators

Utility Operators

这篇继续介绍 Conditional and Boolean Operators

参考

Docs – Conditional and Boolean Operators

defaultIfEmtpty

顾名思义, 如果一个流在 complete 前都没有任何发布, 那么至少发布一次 with default value.

const subject = new Subject<number>();
subject.pipe(defaultIfEmpty(5)).subscribe({
next: v => console.log('next', v),
complete: () => console.log('complete'),
});
subject.complete(); // 没有 next, 直接 complete

效果

every

every 和 JS array every 类似. 如果所有发布的值都符合条件那就发布 true, 不然就 false

const subject = new Subject<number>();
subject.pipe(every(v => v > 5)).subscribe(v => console.log('next', v));
subject.next(6);
subject.next(7);
subject.complete(); // console: true

注: 只有在 complete 后, RxJS 才能确保 every value match condition 哦.

但是只要其中一个 failure, 那不需要等 complete, 直接可以返回 false

const subject = new Subject<number>();
subject.pipe(every(v => v > 5)).subscribe({
next: v => console.log('next', v),
complete: () => console.log('complete'),
});
subject.next(1); // 直接 console: false, 同时也发布 complete

find

find 和 first 很像, 最大的区别是, first 要求一定要有匹配, 不然就报错.

find 则没有这个要求.

first

const subject = new Subject<number>();
subject.pipe(first(v => v === 5)).subscribe({
next: v => console.log('next', v),
error: e => console.log('error', e),
});
subject.next(1);
subject.complete();

效果

报错了, 因为 subject complete 前, 没有任何值符合 first 的匹配条件.

find

const subject = new Subject<number>();
subject.pipe(find(v => v === 5)).subscribe({
next: v => console.log('next', v),
error: e => console.log('error', e),
});
subject.complete();

效果

当 subject complete 后, 如果都没有匹配的 value, 那么至少会触发一次 next, value 是 undefined.

这就是 find 和 first 最大的区别了.

findIndex

findIndex 和 find 差不多, 只是说它返回的是 index (zero-based).

如果没有任何值匹配, complete 后至少会发布一次 next value 是 -1.

const subject = new Subject<number>();
subject.pipe(findIndex(v => v === 5)).subscribe({
next: v => console.log('next', v),
error: e => console.log('error', e),
});
subject.complete();

效果

isEmpty

当 stream complete 后, 如果没有发布过任何值, 那么至少会发布一次 next, value 是 true

const subject = new Subject<number>();
subject.pipe(isEmpty()).subscribe({
next: v => console.log('next', v),
complete: () => console.log('complete'),
});
subject.complete();

效果

如果 complete 前就已经发布值, 那么 isEmpty subscrube 会接收 false 并且触发 complete.

const subject = new Subject<number>();
subject.pipe(isEmpty()).subscribe({
next: v => console.log('next', v),
complete: () => console.log('complete'),
});
subject.next(5);

效果

一句话总结

defaultIfEmpty : 在 complete 后, 至少发布一个 next with default value

every : 在 complete 后, 过往发布的所有值都满足条件就发布 true. 发布中, 但凡其中一个值不符合条件, 直接发布 false 同时 complete 掉.

find : first match 不到会报错, find 不会, complete 后 match 不到就 next with undefined

findIndex : 和 find 一样, 但值是 index, 没有 matched 就值是 -1

isEmpty : complete 后没有任何发布就是 true, 但凡有一次发布就立马是 false 同时 complete 掉

RxJS 系列 – Conditional and Boolean Operators的更多相关文章

  1. [RxJS] Adding Conditional Logic with Filter

    Often you only want values to proceed through your stream if they meet certain criteria, just as if ...

  2. RxSwift 系列(八) -- Error Handing Operators

    前言 本篇文章我们将学习RxSwift中的错误处理,包括: catchErrorJustReturn catchError retry retry(_:) catchErrorJustReturn 遇 ...

  3. rxjs笔记(未完成)

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

  4. ReactiveX Operators

    This documentation groups information about the various operators and examples of their usage into t ...

  5. Rxjava, RxAndroid, Retrofit 等库的使用

    RxJava的基本用法: 关于 unSubscribe() 的调用问题: There is no need to unsubscribe in onCompleted. Take a look at  ...

  6. ReactiveX 学习笔记(6)条件操作符

    Conditional and Boolean Operators 本文的主题为处理 Observable 的条件和布尔操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...

  7. RxSwift 之官方文档

    RxSwift 官方文档结构 Introduction: Subjects Transforming Observables Filtering Observables Combining Obser ...

  8. Rx = Observables(响应) + LINQ(声明式语言) + Schedulers(异步)

    Reactive = Observables(响应)+ Schedulers(异步). Extensions = LINQ(语言集成查询) LINQ: The Operators of Reactiv ...

  9. RxJava中的doOnSubscribe默认运行线程分析

    假设你对RxJava1.x还不是了解,能够參考以下文章. 1. RxJava使用介绍 [视频教程] 2. RxJava操作符   • Creating Observables(Observable的创 ...

  10. RxJava 2.x 理解-2

    操作符总结: http://reactivex.io/documentation/operators.html https://github.com/ReactiveX/RxJava/wiki Ope ...

随机推荐

  1. 开源流式湖仓服务 Arctic 详解:并非另一套 Table Format

    [点击了解更多知识] 本文根据作者于 Arctic 开源发布会演讲内容整理(略有删减),系统解读 Arctic 项目研发初衷.生态定位.核心特性.性能表现及未来规划. 首先感谢大家参与我们 Arcti ...

  2. Using temporary与Using filesort

    Using temporary Using temporary表示由于排序没有走索引.使用union.子查询连接查询.使用某些视图等原因(详见https://dev.mysql.com/doc/ref ...

  3. 阅读翻译Mathematics for Machine Learning之2.6 Generating Set and Basis

    阅读翻译Mathematics for Machine Learning之2.6 Generating Set and Basis 关于: 首次发表日期:2024-07-19 Mathematics ...

  4. Vue 修改网页标题和图标

    Vue 修改网页标题和图标   by:授客 QQ:1033553122   开发环境   Win 10   Vue 2.5.2 需求描述 如下,想更改网页的标题和图标 解决方法 编辑项目根目录下的in ...

  5. 面试题-python 什么是闭包(closure)?

    前言 前面学了装饰器,那么闭包和装饰器有什么区别呢?闭包传递的是变量,而装饰器传递的是函数对象,只是传的参数内容不一样,闭包的概念包含了装饰器,可以说装饰器是闭包的一种,它只是传递函数对象的闭包. 先 ...

  6. 【CI/CD】Centos7 下载安装 Jenkins

    一.Docker安装Jenkins 参考: https://www.bilibili.com/video/BV11B4y1W7eH?p=5 安装Jenkins最新稳定版镜像: [root@Centos ...

  7. 使用PasteSpider实现类似Jenkins的功能,让你的2G服务器也可以飞起

    或许你接触过Jenkins, 在我理解就是拉取源码,然后构建成镜像,最后启动容器! 但是这个功能对于小内存的服务器来说就是奢望了! 今天介绍一个新版本,把你这个遗憾弥补下! 在PasteSpider中 ...

  8. 从markdown引擎实现的角度看markerdown到底是什么?

    引用百度百科的解释: 链接:https://baike.baidu.com/item/markdown/3245829 Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Grub ...

  9. MindSpore中使用model.train,在每一步训练结束后自动进行调用自定义函数 —— from mindspore.train.callback import Callback

    在MindSpore中使用model.train训练网络时我们难以处理间断性的任务,为此我们可以考虑使用MindSpore中的Callback机制.Callback 函数可以在 model.train ...

  10. tensorflow1.x——如何在python多线程中调用同一个session会话

    如何在python多线程中调用同一个session会话? 这个问题源于我在看的一个强化学习代码: https://gitee.com/devilmaycry812839668/scalable_age ...