RxJS 系列 – Conditional and Boolean 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 掉