rxjs 之 map 操作
常用的几种 map: map/mapTo/switchMap/exhaustMap/mergeMap/concatMap
Rxjs里常用的几种 map 操作:
- map
- mapTo
- switchMap
- exhaustMap
- mergeMap(flatMap)
- concatMap
自己的一些理解:
- 本质上他们都是
map
方法 - 不改变类型的
map
,如 number in, number out
,使用 map
- 将值映射成固定值用
mapTo
- 需要将值映射成
observerble
的,请使用 switchMap/exhaustMap/mergeMap/concatMap
几种 Map 操作的一些区别:
- 当
actions
既不应该被中止,也不应该被忽略,并且其次序也必须保持不变,请使用 concatMap
。它也是个保守的选择,因此其行为总是可以被预测的。 - 当
actions
既不应该被中止,也不应该被忽略,并且其次序并不重要,请使用 mergeMap
。 - 和读取相关的
actions
,并且当有同类型的 action
发出时这些原有 actions
应该被中止,请使用 switchMap (example: autocomplete)
- 当有同类型的
action
发出时,原有的 actions
应该被忽略,请使用 exhaustMap
。 (example
: 一次重要的提交操作)
场景1:使用 switchMap 完成 api 的 get 请求操作
import { defer, of, fromEvent, from } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
const btn1 = document.getElementById('btn1');
const $click = fromEvent(btn1, 'click');
const data$ = switchMap(() => fetch('https://api.github.com/users/afeiship'));
$click
.pipe(
data$,
switchMap((v) => v.json())
)
.subscribe((e) => {
console.log('response: ', e);
});
参考:
https://zhuanlan.zhihu.com/p/55199532