123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- import { Operator } from '../Operator';
- import { Subscriber } from '../Subscriber';
- import { Observable } from '../Observable';
- import { empty } from '../observable/empty';
- import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
- /**
- * Returns an Observable that will resubscribe to the source stream when the source stream completes, at most count times.
- *
- * <span class="informal">Repeats all values emitted on the source. It's like {@link retry}, but for non error cases.</span>
- *
- * 
- *
- * Similar to {@link retry}, this operator repeats the stream of items emitted by the source for non error cases.
- * Repeat can be useful for creating observables that are meant to have some repeated pattern or rhythm.
- *
- * Note: `repeat(0)` returns an empty observable and `repeat()` will repeat forever
- *
- * ## Example
- * Repeat a message stream
- * ```ts
- * import { of } from 'rxjs';
- * import { repeat, delay } from 'rxjs/operators';
- *
- * const source = of('Repeat message');
- * const example = source.pipe(repeat(3));
- * example.subscribe(x => console.log(x));
- *
- * // Results
- * // Repeat message
- * // Repeat message
- * // Repeat message
- * ```
- *
- * Repeat 3 values, 2 times
- * ```ts
- * import { interval } from 'rxjs';
- * import { repeat, take } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const example = source.pipe(take(3), repeat(2));
- * example.subscribe(x => console.log(x));
- *
- * // Results every second
- * // 0
- * // 1
- * // 2
- * // 0
- * // 1
- * // 2
- * ```
- *
- * @see {@link repeatWhen}
- * @see {@link retry}
- *
- * @param {number} [count] The number of times the source Observable items are repeated, a count of 0 will yield
- * an empty Observable.
- * @return {Observable} An Observable that will resubscribe to the source stream when the source stream completes
- * , at most count times.
- * @method repeat
- * @owner Observable
- */
- export function repeat<T>(count: number = -1): MonoTypeOperatorFunction<T> {
- return (source: Observable<T>) => {
- if (count === 0) {
- return empty();
- } else if (count < 0) {
- return source.lift(new RepeatOperator(-1, source));
- } else {
- return source.lift(new RepeatOperator(count - 1, source));
- }
- };
- }
-
- class RepeatOperator<T> implements Operator<T, T> {
- constructor(private count: number,
- private source: Observable<T>) {
- }
- call(subscriber: Subscriber<T>, source: any): TeardownLogic {
- return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
- }
- }
-
- /**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
- class RepeatSubscriber<T> extends Subscriber<T> {
- constructor(destination: Subscriber<any>,
- private count: number,
- private source: Observable<T>) {
- super(destination);
- }
- complete() {
- if (!this.isStopped) {
- const { source, count } = this;
- if (count === 0) {
- return super.complete();
- } else if (count > -1) {
- this.count = count - 1;
- }
- source.subscribe(this._unsubscribeAndRecycle());
- }
- }
- }
|