在 RxJS 中,ExhaustMap、MergeMap、SwitchMap 和 ConcatMap 是四种常用的操作符,用于处理 Observable 流和进行数据转换。它们之间的区别在于它们在处理新的 Observable 时的行为不同。以下是它们的区别:
-
ExhaustMap:- 当源 Observable 发出值时,
ExhaustMap会将这个值映射成一个新的 Observable,并且只会订阅这个新 Observable。 - 如果在这个新 Observable 订阅期间,源 Observable 再次发出值,那么这个值会被忽略,直到新 Observable 完成。如果在这个新 Observable 订阅期间,源 Observable 再次发出值,那么这个值会被忽略,直到新 Observable 完成。
- 适用于处理顺序执行的任务,确保每个任务都执行完毕后再执行下一个任务。
- **在我们点击按钮发送异步的时候一直点击只会处理当前的,后面的会忽略掉 **
- 当源 Observable 发出值时,
-
MergeMap:- 当源 Observable 发出值时,
MergeMap会将这个值映射成一个新的 Observable,并且会同时订阅所有这些新 Observable。 - 新 Observable 可以并发执行,结果会按照它们完成的顺序合并。
- 适用于并发执行多个任务,不需要等待前一个任务完成。
- 主要用户创建新的流,一般用来处理多个请求 比如一个请求过来,拆分10个请求,每个请求再去请求100个数据拼接起来。
- 当源 Observable 发出值时,
-
SwitchMap:- 当源 Observable 发出值时,
SwitchMap会将这个值映射成一个新的 Observable,并且会取消订阅之前的 Observable,然后订阅新的 Observable。 - 适用于处理只关心最新数据的情况,比如搜索建议等。
- 主要就是可以忽略上一个请求,做竞态处理很好
- 当源 Observable 发出值时,
-
ConcatMap:- 当源 Observable 发出值时,
ConcatMap会将这个值映射成一个新的 Observable,并且会按顺序订阅这些新 Observable。 - 新 Observable 会按照它们被订阅的顺序依次执行,一个完成后才会订阅下一个。
- 适用于需要按顺序执行任务的情况,确保任务按照顺序执行。
- 确保顺序执行
- 当源 Observable 发出值时,
总结:
ExhaustMap会忽略新值,直到当前 Observable 完成。MergeMap会并发处理所有新值。SwitchMap会取消订阅之前的 Observable,只关注最新的值。ConcatMap会按顺序处理所有新值。