首页 > 其他分享 >RxJS 系列 – Conditional and Boolean Operators

RxJS 系列 – Conditional and Boolean Operators

时间:2023-04-03 21:55:53浏览次数:50  
标签:console complete Operators Conditional next Boolean log subject

前言

前几篇介绍过了 

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 掉

 

标签:console,complete,Operators,Conditional,next,Boolean,log,subject
From: https://www.cnblogs.com/keatkeat/p/17284490.html

相关文章