「这是我参与2022首次更文挑战的第31天,活动详情查看:2022首次更文挑战」
判断流是否为空,返回一个布尔类型的数据,这里补充一个知识点,在最新版本 Rxjs 中,内置了一个 EMPTY 变量来表示一个空的 Observable 对象,因此这里可以使用 EMPTY 进行测试:
EMPTY.pipe(isEmpty()).subscribe(x => console.log(x));
// true
of(1).pipe(isEmpty()).subscribe(x => console.log(x));
// false
这里 isEmpty 的判断逻辑是,一旦原始 Observable 发出一个数据,立即发出一个 false 并终止,如果原始 Observable 到结束为止始终未发出数据,这时发出 true。
弹珠图:
defaultIfEmpty
如果原始流是空数据流,那么为原始流添加一个默认值,由于空流是根据流到结束为止是否产生过数据来判断的,因此这里会在流结束时发出这个默认值,举个例子:
fromEvent(document, 'click').pipe(
takeUntil(interval(5000)),
defaultIfEmpty('no clicks')
).subscribe(x => console.log(x));
这里如果在结束前未点击就会打印出 no clicks 内容。
弹珠图:
find
查找一个满足条件的数据,每当原始数据流发出一项数据,find 就会匹配一下是否满足条件,如果满足发出这个数据并结束 find 流。如果不满足继续查找,直到找到第一个符合要求的数据。如果所有数据都不满足,find 就没有内容,不会报错。
举个例子:
fromEvent(document, 'click').pipe(find(ev => ev.target.tagName === 'DIV')).subscribe(x => console.log(x));
弹珠图:
findIndex
findIndex 与 find 的语法是类似的,从效果上来看,它们的区别在于 find 返回的是值内容,而 findIndex 返回的是元素的 index(这里依旧是从 0 开始),同样也是从头开始找,当找到第一项时结束,上面的例子修改为 findIndex 同样有效:
fromEvent(document, 'click').pipe(findIndex(ev => ev.target.tagName === 'DIV')).subscribe(x => console.log(x));
弹珠图:
every
判断流中所有的数据是否都满足条件,如果都满足返回 true,有一个不满足就返回 false。这里的策略依旧是发出一个比较一个,因此如果发现有一个不满足,可以直接发出 false 并结束流,只有当流结束且全部满足时才会发出 true。举个例子:
of(1, 2, 3, 4, 5, 6).pipe(every(x => x < 5)).subscribe(x => console.log(x));
// false
使用弹珠图表示:
常用的条件和布尔相关的操作符只有这么多,这部分内容比较简单,理解起来也没什么难度,因此本篇内容比较少,下一篇继续看剩下的操作符。