RxJs高阶运算——mergeMap
上一节我们介绍了第一个高阶运算concatMap,今天我们开始学习第二个高阶运算mergeMap。
同样的道理,为了掌握mergeMap,我们先了解merge。
mergeMap动态图

我们知道concatMap是顺序执行,有的时候我们可能需要并行执行,此时我们就要用到merge.
Observable Merge
代码举例
onst series1$ = interval(1000).pipe(map(val => val*10));
const series2$ = interval(1000).pipe(map(val => val*100));
const result$ = merge(series1$, series2$);
result$.subscribe(console.log);日志信息

可以看出, merge的源 Observable 的值在发出后立即显示在结果 Observable 中。如果merge的 Observable 之一完成,merge 将继续发出其他 Observable 的值,因为它们随着时间的推移到达。请注意,如果源 Observables 完成,合并仍将以相同的方式工作。
我们看看弹珠图:
merge弹珠图
<figure class="image"> </figure>merge后的源 Observable 的值立即显示在输出中。直到所有merge的 Observable 完成后,结果 Observable 才会完成。
</figure>merge后的源 Observable 的值立即显示在输出中。直到所有merge的 Observable 完成后,结果 Observable 才会完成。
现在我们了解了合并策略,让我们看看它如何在高阶 Observable 映射的上下文中使用。
mergeMap Operator
mergeMap弹珠图
<figure class="image"> </figure>### mergeMap分析
</figure>### mergeMap分析
1、源 Observable 的每个值仍然被映射到内部 Observable 中,就像 concatMap 的情况一样
2、和 concatMap 一样,内部 Observable 也被 mergeMap 订阅
3、当内部 Observable 发出新值时,它们会立即反映在输出 Observable 中
4、但与 concatMap 不同的是,在 mergeMap 的情况下,我们不必等待前一个内部 Observable 完成才能触发下一个内部 Observable
5、这意味着使用 mergeMap(与 concatMap 不同)我们可以让多个内部 Observables 随时间重叠,并行发出值,就像我们在图片中以红色突出显示的那样
代码举例
this.form.valueChanges
    .pipe(
        mergeMap(formValue => 
                 this.http.put(`/api/course/${courseId}`, 
                               formValue))
    )
    .subscribe(
       saveResult =>  ... handle successful save ...,
        err => ... handle save error ...      
    );日志信息
<figure class="image"> </figure>如图所示,请求是并行发生的,在这种情况下是一个错误!在重负载下,这些请求可能会被乱序处理。
</figure>如图所示,请求是并行发生的,在这种情况下是一个错误!在重负载下,这些请求可能会被乱序处理。
 
             
             
             
             
            