Home Manual Reference Source Test Repository

es6/observable/ArrayObservable.js

import { Observable } from '../Observable';
import { ScalarObservable } from './ScalarObservable';
import { EmptyObservable } from './EmptyObservable';
import { isScheduler } from '../util/isScheduler';
/**
 * We need this JSDoc comment for affecting ESDoc.
 * @extends {Ignored}
 * @hide true
 */
export class ArrayObservable extends Observable {
    constructor(array, scheduler) {
        super();
        this.array = array;
        this.scheduler = scheduler;
        if (!scheduler && array.length === 1) {
            this._isScalar = true;
            this.value = array[0];
        }
    }
    static create(array, scheduler) {
        return new ArrayObservable(array, scheduler);
    }
    /**
     * 创建一个 Observable,它会依次发出由你提供的参数,最后发出完成通知。
     * <span class="informal">发出你提供的参数,然后完成。
     * </span>
     *
     * <img src="./img/of.png" width="100%">
     *
     * 这个静态操作符适用于创建简单的 Observable ,该 Observable 只发出给定的参数,
     * 在发送完这些参数后发出完成通知。它可以用来和其他 Observables 组合比如说{@link concat}。
     * 默认情况下,它使用`null`调度器,这意味着`next`通知是同步发出的,
     * 尽管使用不同的调度器可以决定这些通知何时送到。
     *
     * @example <caption>发出 10、20、 30, 然后是 'a'、 'b'、 'c', 紧接着开始每秒发出。</caption>
     * var numbers = Rx.Observable.of(10, 20, 30);
     * var letters = Rx.Observable.of('a', 'b', 'c');
     * var interval = Rx.Observable.interval(1000);
     * var result = numbers.concat(letters).concat(interval);
     * result.subscribe(x => console.log(x));
     *
     * @see {@link create}
     * @see {@link empty}
     * @see {@link never}
     * @see {@link throw}
     *
     * @param {...T} values 表示 `next` 发出的值。
     * @param {Scheduler} [scheduler] 用来调度 next 通知发送的调度器( {@link IScheduler} )。
     * @return {Observable<T>} 发出每个给定输入值的 Observable。
     * @static true
     * @name of
     * @owner Observable
     */
    static of(...array) {
        let scheduler = array[array.length - 1];
        if (isScheduler(scheduler)) {
            array.pop();
        }
        else {
            scheduler = null;
        }
        const len = array.length;
        if (len > 1) {
            return new ArrayObservable(array, scheduler);
        }
        else if (len === 1) {
            return new ScalarObservable(array[0], scheduler);
        }
        else {
            return new EmptyObservable(scheduler);
        }
    }
    static dispatch(state) {
        const { array, index, count, subscriber } = state;
        if (index >= count) {
            subscriber.complete();
            return;
        }
        subscriber.next(array[index]);
        if (subscriber.closed) {
            return;
        }
        state.index = index + 1;
        this.schedule(state);
    }
    _subscribe(subscriber) {
        let index = 0;
        const array = this.array;
        const count = array.length;
        const scheduler = this.scheduler;
        if (scheduler) {
            return scheduler.schedule(ArrayObservable.dispatch, 0, {
                array, index, count, subscriber
            });
        }
        else {
            for (let i = 0; i < count && !subscriber.closed; i++) {
                subscriber.next(array[i]);
            }
            subscriber.complete();
        }
    }
}
//# sourceMappingURL=ArrayObservable.js.map