Home Manual Reference Source Test Repository

es6/operator/concat.js

import { Observable } from '../Observable';
import { isScheduler } from '../util/isScheduler';
import { ArrayObservable } from '../observable/ArrayObservable';
import { MergeAllOperator } from './mergeAll';
/* tslint:enable:max-line-length */
/**
 * 创建一个输出 Observable,它在当前 Observable 之后顺序地发出每个给定的输入 Observable 中的所有值。
 *
 * <span class="informal">通过顺序地发出多个 Observables 的值将它们连接起来,一个接一个的。</span>
 *
 * <img src="./img/concat.png" width="100%">
 *
 * 通过依次订阅输入Observable将输出Observable加入多个输入Observable,从源头开始,
 * 合并它们的值给输出Observable. 只有前一个Observable结束才会进行下一个Observable。
 *
 * @example <caption>将从0数到3的定时器和从1到10的同步序列进行连接</caption>
 * var timer = Rx.Observable.interval(1000).take(4);
 * var sequence = Rx.Observable.range(1, 10);
 * var result = timer.concat(sequence);
 * result.subscribe(x => console.log(x));
 *
 * // results in:
 * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
 *
 * @example <caption>连接3个Observables</caption>
 * var timer1 = Rx.Observable.interval(1000).take(10);
 * var timer2 = Rx.Observable.interval(2000).take(6);
 * var timer3 = Rx.Observable.interval(500).take(10);
 * var result = timer1.concat(timer2, timer3);
 * result.subscribe(x => console.log(x));
 *
 * // results in the following:
 * // (Prints to console sequentially)
 * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
 * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
 * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
 *
 * @see {@link concatAll}
 * @see {@link concatMap}
 * @see {@link concatMapTo}
 *
 * @param {ObservableInput} other 等待被连接的 Observable。 可以接受多个输入 Observable。
 * @param {Scheduler} [scheduler=null] 可选的调度器,控制每个输入 Observable 的订阅。
 * @return {Observable} 顺序的、串行的将所有输入 Observable 的值合并给输出 Observable。
 * @method concat
 * @owner Observable
 */
export function concat(...observables) {
    return this.lift.call(concatStatic(this, ...observables));
}
/* tslint:enable:max-line-length */
/**
 * 创建一个输出 Observable,该 Observable 顺序的发出每个输入 Observable 的所有值。
 *
 * <span class="informal">连接多个输入 Observable,顺序的发出它们的值,一个
 * Observable 接一个 Observable。</span>
 *
 * <img src="./img/concat.png" width="100%">
 *
 * `concat`通过一次订阅一个将多个 Observables 连接起来,并将值合并到输出 Observable 中。
 * 你可以传递一个输入 Observable 数组,或者直接把它们当做参数传递。 传递一个空数组会
 * 导致输出 Observable 立马触发完成状态。
 *
 * `concat`会订阅第一个输入 Observable 并且发出它的所有值, 不去做任何干预。 当这个
 * 输入 Observable 完成时, 订阅第二个输入 Observable,同样的发出它的所有值。这个过
 * 程会不断重复直到输入 Observable 都用过了。当最后一个输入 Observable 完成时,`concat`
 * 也会完成。 任何时刻都只会有一个输入 Observable 发出值。 如果你想让所有的输入 Observable
 * 并行发出数据,请查看{@link merge}, 特别的带上`concurrent`参数。 事实上,`concat`和
 * `concurrent`设置为1的`merge`效果是一样的。
 *
 * 注意,如果输入 Observable 一直都不完成, `concat` 也会一直不能完成并且下一个输入 Observable
 * 将永远不能被订阅. 另一方面, 如果某个输入 Observable 在它被订阅后立马处于完成状态, 那么它对
 * `concat`是不可见的, 仅仅会转向下一个输入 Observable.
 *
 * 如果输入 Observable 链中的任一成员发生错误, `concat`会立马触发错误状态,而不去控制下一个输入
 * Observable. 发生错误的输入 Observable 之后的输入 Observable 不会被订阅.
 *
 * 如果你将同一输入 Observable 传递给`concat`多次,结果流会在每次订阅的时候“重复播放”, 这意味着
 * 你可以重复 Observable 多次. 如果你乏味的给`concat`传递同一输入 Observable 1000次,你可以试着
 * 用用{@link repeat}.
 *
 * @example <caption>将从0数到3的定时器和从1到10的同步序列进行连接</caption>
 * var timer = Rx.Observable.interval(1000).take(4);
 * var sequence = Rx.Observable.range(1, 10);
 * var result = Rx.Observable.concat(timer, sequence);
 * result.subscribe(x => console.log(x));
 *
 * // results in:
 * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
 *
 *
 * @example <caption>连接3个 Observables</caption>
 * var timer1 = Rx.Observable.interval(1000).take(10);
 * var timer2 = Rx.Observable.interval(2000).take(6);
 * var timer3 = Rx.Observable.interval(500).take(10);
 * var result = Rx.Observable.concat([timer1, timer2, timer3]); // note that array is passed
 * result.subscribe(x => console.log(x));
 *
 * // results in the following:
 * // (Prints to console sequentially)
 * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
 * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
 * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
 *
 *
 * @example <caption>连接同一个 Observable 多次</caption>
 * const timer = Rx.Observable.interval(1000).take(2);
 *
 * Rx.Observable.concat(timer, timer) // concating the same Observable!
 * .subscribe(
 *   value => console.log(value),
 *   err => {},
 *   () => console.log('...and it is done!')
 * );
 *
 * // Logs:
 * // 0 after 1s
 * // 1 after 2s
 * // 0 after 3s
 * // 1 after 4s
 * // "...and it is done!" also after 4s
 *
 * @see {@link concatAll}
 * @see {@link concatMap}
 * @see {@link concatMapTo}
 *
 * @param {ObservableInput} input1 等待被连接的输入 Observable。
 * @param {ObservableInput} input2 等待被连接的输入 Observable。
 * 可以传递多个输入Observable.
 * @param {Scheduler} [scheduler=null] 可选的调度器,调度每个 Observable 的订阅。
 * @return {Observable} 有序的、串行的将所有输入 Observable 的值合并到单一的输出 Observable。
 * @static true
 * @name concat
 * @owner Observable
 */
export function concatStatic(...observables) {
    let scheduler = null;
    let args = observables;
    if (isScheduler(args[observables.length - 1])) {
        scheduler = args.pop();
    }
    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {
        return observables[0];
    }
    return new ArrayObservable(observables, scheduler).lift(new MergeAllOperator(1));
}
//# sourceMappingURL=concat.js.map