在 RxJS 中这是一个通用的模式,因此有一个快捷方式来实现相同的行为 —— mergeMap(): mergeMap() <=> map() + mergeAll() const button = document.querySelector click$ = fromEvent(button, 'click'); const interval$ = interval(1000); const observable$ = click$.pipe(mergeMap switch Like mergeMap() but when the source observable emits cancel any previous subscriptions of the 参考资源 understanding-mergemap-and-switchmap-in-rxjs
基础知识 mergeMap mergeMap 操作符用于从内部的 Observable 对象中获取值,然后返回给父级流对象。 合并 Observable 对象 import { of } from "rxjs"; import { mergeMap } from "rxjs/operators"; const source$ = of("Hello"); const example$ = source$.pipe(mergeMap(val => of(`${val} World! 答案是有的,可以通过 RxJS 库中提供的 mergeMap 操作符来简化上述的流程。 /http'; import { mergeMap } from 'rxjs/operators'; @Component({ selector: 'my-app', template: `
我们可以借助 flatMap 操作符,则能得到同样的解析值的效果~ flatMap 其实也就是我们熟知的 mergeMap 操作符; 代码如下: const { of } = Rx; const { mergeMap 'B'); const http =(name)=>{ return of(`${name} 1`,`${name} 2`); } namesObservable.pipe( mergeMap 我们再借助 https://rxviz.com/ 的弹珠图,一眼便能看到它们的差异: 设置一个定时器,每一秒都发出一个 observable,一共发 3 次,来看下分别得值; mergeMap const { of,interval} = Rx; const { mergeMap,take,map } = RxOperators; const namesObservable = of('A', 'B' (name => http(name)) ) mergeMap 会同时维护多个活动的内部订阅; switchMap const { of,interval} = Rx; const { switchMap
Actions, createEffect, ofType } from `@ngrx/effects`;import { of } from `rxjs`;import { catchError, map, mergeMap = createEffect(() => this.actions$.pipe( ofType(loadData), // 仅处理 loadData 类型的 Action mergeMap mergeMap:将 Action 映射为一个新的 Observable,处理异步数据流。错误处理:通过 catchError 捕获错误并派发失败 Action。2. Injectable } from `@angular/core`;import { Actions, createEffect, ofType } from `@ngrx/effects`;import { mergeMap (() => this.actions$.pipe( ofType(actionOne, actionTwo), // 同时监听 actionOne 和 actionTwo mergeMap
rowStyle = new TableStyle(); rowStyle.setAlign(STJc.CENTER); TreeMap<Integer, Integer> mergeMap *中心")) { mergeMap.put(j, 1); j2 = j; } } else { //预处理合并列 mergeMap.put(j2, mergeMap.get ((k, v) -> { temp.put(k + v, v); }); mergeMap.clear(); mergeMap.putAll = null) { Integer colNum = mergeMap.get(i); int flag = i == this.i ?
mergeMap (原来叫flatMap) mergeMap把每个输入的Observable的值映射成Observable, 然后把它们混合成一个Observable. mergeMap可以把嵌套的observables { Observable } from "rxjs/Observable"; import 'rxjs/add/observable/from'; import 'rxjs/add/operator/mergeMap switchMap switchMap把每个值都映射成Observable, 然后使用switch把这些内部的Observables合并成一个. switchMap有一部分很想mergeMap, 但也仅仅是一部分像而已 vs switchMap的例子 mergeMap: import { Observable } from "rxjs/Observable"; import 'rxjs/add/observable/ /add/operator/switchMap'; const outer = Observable.interval(1000).take(2); const combined = outer.mergeMap
platform-browser'; import 'rxjs/add/operator/filter'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/mergeMap route.firstChild; return route; }) .filter(route => route.outlet === 'primary') .mergeMap
homeworld; this.loadedCharacter = character; }); }); } 上面的嵌套写法可读性不那么好,我们可以使用RxJS提供的mergeMap core'; import { Http } from '@angular/http'; import { Observable } from 'rxjs/Observable'; import { mergeMap HttpClient) { } ngOnInit() { this.homeworld = this.http.get('/api/people/1') .pipe( mergeMap (character => this.http.get(character.homeworld)) ); } } mergeMap 操作符用于从内部的 Observable 对象中获取值,然后返回给父级流对象
(原来叫flatMap) mergeMap把每个输入的Observable的值映射成Observable, 然后把它们混合成一个Observable. mergeMap可以把嵌套的observables { Observable } from "rxjs/Observable"; import 'rxjs/add/observable/from'; import 'rxjs/add/operator/mergeMap ); 效果: switchMap switchMap把每个值都映射成Observable, 然后使用switch把这些内部的Observables合并成一个. switchMap有一部分很想mergeMap vs switchMap的例子 mergeMap: import { Observable } from "rxjs/Observable"; import 'rxjs/add/observable /add/operator/switchMap'; const outer = Observable.interval(1000).take(2); const combined = outer.mergeMap
myBufferedInterval.subscribe(val => console.log(' Buffered Values:', val) ); concatMap concatMap 可以将值进行映射,还有一个与之相似的是 mergeMap World' const subscribe = example.subscribe(val => console.log('Example w/ Promise:', val) ); // mergeMap // 发出 'Hello' const source = of('Hello'); // mergeMap 还会发出 promise 的结果 const myPromise = val => new `)); // 映射成 promise 并发出结果 const example = source.pipe(mergeMap(val => myPromise(val))); // 输出: 'Hello
console.log('Completed') }); // 取消订阅 subscription.unsubscribe(); Operators:RxJS 提供了丰富的操作符(如 map、filter、mergeMap mergeMap:将一个 Observable 映射为另一个 Observable,并将结果展平。 debounceTime:延迟发出值,常用于处理用户输入防抖! 实时数据处理:如 WebSocket 数据流,通过 mergeMap 和 filter 处理复杂逻辑。 异步任务协调:使用 forkJoin 或 combineLatest 组合多个异步请求!
utils.isUndefined(config2[prop])) { return getMergedValue(config1[prop], config2[prop], mergeMap ]); } } utils.forEach(Object.keys(mergeMap), function(prop) { var merge = mergeMap[prop]; mergeMap.hasOwnProperty(key); }); otherKeys.forEach(function(key) { config[key] = getMergedValue 通过定义 mergeMap 来指定不同配置项的合并策略,使得配置合并更加灵活和可控。 8.3 重点逻辑合并策略:根据 mergeMap 中定义的策略,对不同的配置项采用不同的合并方式,如 configValue、defaultValue 和 merge。
catch -> catchError, switch -> switchAll, finally -> finalize import { map, filter, catchError, mergeMap 以下为升级示例: // Rxjs5写法,操作符链 source .map(x => x + x) .mergeMap(n => of(n + 1, n + 2) .filter(x => found')) .subscribe(printResult); // Rxjs写法,需要用pipe包一下所有的操作符 source.pipe( map(x => x + x), mergeMap
Rx.Observable.prototype.mergeMap mergeMap 也是 RxJS 中常用的接口,我们来结合 marbles 图(flatMap(alias))来理解它 上面的数据流中 ,产生了新的分支流(流中流),mergeMap 的作用则是将分支流调整回主干上,最终分支上的数据流都经过主干的其他操作,其实也是将流中流进行扁平化。 除了上面提到的 marbles,也可以 ASCII 字符的方式来绘制可视化图表,下面将结合 Map、mergeMap 和 switchMap 进行对比来理解。 @Map @mergeMap @switchMap ↗ ↗ ↗ ↗ - Rx.Observable.prototype.mergeMap() 将请求搜索结果输出回给 Observer 上进行渲染。
angular/core';import { Actions, createEffect, ofType } from '@ngrx/effects';import { catchError, map, mergeMap UserService) {} loadUsers$ = createEffect(() => this.actions$.pipe( ofType(UserActions.loadUsers), mergeMap createEffect(() => this.actions$.pipe( ofType(UserActions.loadUsers), filter(() => someCondition()), mergeMap
50%, -50%) rotate(135deg); } 页面的效果如下: 接着,我们添加 javascript 让页面动起来: const { fromEvent } = rxjs; const { mergeMap , 'mouseup'); const drag$ = fromEvent(document.getElementById('icon-resize'), 'mousedown').pipe( mergeMap
对于组合,(最简单的方式)需要使用 .mergeMap 方法,用来把两个 Observable 整合为一个 Observable; 对于使用,我们需要使用 .subscribe 方法,用来通知 Observer
下面是我经常使用的一些操作符: 1. mergeMap 2. switchMap 3. exhaustMap 4. map 5. catchError 6. startWith 7. delay 8. 下面是我经常使用的一些操作符: 1. mergeMap 2. switchMap 3. exhaustMap 4. map 5. catchError 6. startWith 7. delay 8. redux-observable: const getCommentsEpic = (action$, state$) => action$.pipe( ofType('GET_COMMENTS'), mergeMap loadSuggestionsEpic = (action$, state$) => action$.pipe( ofType('VALUE_CHANGED'), debounce(1000), mergeMap 要使用redux-observable实现相同的功能,我们只需要将.mergemap替换为.switchmap: const loadSuggestionsEpic = (action$, state$
过滤 debounceTime , distinctUntilChanged , filter , take , takeUntil 转换 bufferTime , concatMap , map , mergeMap { pipe, range, timer, zip } from 'rxjs'; import { ajax } from 'rxjs/ajax'; import { retryWhen, map, mergeMap attempts => range(1, maxTries) .pipe( zip(attempts, (i) => i), map(i => i * i), mergeMap
Immutable.Map({ a: 10, b: 20, c: 30 }); const two = Immutable.Map({ a: 40, b: 60, c: 90, d: 100 }); const mergeMap1 = one.merge(two); const mergeMap2 = two.merge(one); console.log(mergeMap1.toJS()); // { a: 40, b: 60 , c: 90, d: 100 } console.log(mergeMap2.toJS()); // { a: 10, b: 20, c: 30, d: 100 } // mergeWith const