Home Manual Reference Source Test Repository

es6/operator/concatMap.js

import { MergeMapOperator } from './mergeMap';
/* tslint:enable:max-line-length */
/**
 * 将源值投射为一个合并到输出 Observable 的 Observable,以串行的方式等待前一个完成再合并下一个
 * Observable。
 *
 * <span class="informal">将每个值映射为 Observable, 然后使用{@link concatAll}将所有的
 * 内部 Observables 打平。</span>
 *
 * <img src="./img/concatMap.png" width="100%">
 *
 * 返回一个 Observable,该 Observable 发出基于对源 Observable 发出的值调用提供的函数,
 * 该函数返回所谓的内部 Observable。 每个新的内部 Observable 和前一个内部 Observable 连接在一起。
 *
 * 警告: 如果源值不断的到达并且速度快于内部 Observables 完成的速度, 它会导致内存问题,
 * 因为内部的 Observable 在无限制的缓冲区中聚集,以等待轮流订阅。
 *
 * Note: `concatMap` 等价于 `concurrency` 参数(最大并发数)为1的 `mergeMap` 。
 *
 * @example <caption>每次点击都会触发从0到3的定时器(时间间隔为1秒),定时器之间是串行的</caption>
 * var clicks = Rx.Observable.fromEvent(document, 'click');
 * var result = clicks.concatMap(ev => Rx.Observable.interval(1000).take(4));
 * result.subscribe(x => console.log(x));
 *
 * // 结果如下:
 * // (结果是串行的)
 * // 对于"document"对象上的点击事件,都会以1秒的间隔发出从0到3的值
 * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
 *
 * @see {@link concat}
 * @see {@link concatAll}
 * @see {@link concatMapTo}
 * @see {@link exhaustMap}
 * @see {@link mergeMap}
 * @see {@link switchMap}
 *
 * @param {function(value: T, ?index: number): ObservableInput} project
 * 用在源Observable发出的每个值上,返回Observable.
 * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
 * 函数,它用于产生基于值的输出 Observable 和源(外部)发送和内部 Observable 发送的索引。
 * 传递给这个函数参数有:
 * - `outerValue`: 来自源的值
 * - `innerValue`: 来自投射的 Observable 的值
 * - `outerIndex`: 来自源的值的 "index"
 * - `innerIndex`: 来自投射的 Observable 的值的 "index"
 * @return {Observable} Observable,发出对源Observable发出的每个值使用投射函数
 * (和可选的`resultSelector`)的结果并且顺序的取出每个投射过的内部Observable的值.
 * @method concatMap
 * @owner Observable
 */
export function concatMap(project, resultSelector) {
    return this.lift(new MergeMapOperator(project, resultSelector, 1));
}
//# sourceMappingURL=concatMap.js.map