import { Observable } from '../Observable'; import { isPromise } from '../util/isPromise'; import { isArrayLike } from '../util/isArrayLike'; import { isInteropObservable } from '../util/isInteropObservable'; import { isIterable } from '../util/isIterable'; import { fromArray } from './fromArray'; import { fromPromise } from './fromPromise'; import { fromIterable } from './fromIterable'; import { fromObservable } from './fromObservable'; import { subscribeTo } from '../util/subscribeTo'; import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types'; export function from>(input: O, scheduler?: SchedulerLike): Observable>; /** * Creates an Observable from an Array, an array-like object, a Promise, an iterable object, or an Observable-like object. * * Converts almost anything to an Observable. * * ![](from.png) * * `from` converts various other objects and data types into Observables. It also converts a Promise, an array-like, or an * iterable * object into an Observable that emits the items in that promise, array, or iterable. A String, in this context, is treated * as an array of characters. Observable-like objects (contains a function named with the ES2015 Symbol for Observable) can also be * converted through this operator. * * ## Examples * ### Converts an array to an Observable * ```javascript * import { from } from 'rxjs/observable/from'; * * const array = [10, 20, 30]; * const result = from(array); * * result.subscribe(x => console.log(x)); * * // Logs: * // 10 20 30 * ``` * * --- * * ### Convert an infinite iterable (from a generator) to an Observable * ```javascript * import { take } from 'rxjs/operators'; * import { from } from 'rxjs/observable/from'; * * function* generateDoubles(seed) { * let i = seed; * while (true) { * yield i; * i = 2 * i; // double it * } * } * * const iterator = generateDoubles(3); * const result = from(iterator).pipe(take(10)); * * result.subscribe(x => console.log(x)); * * // Logs: * // 3 6 12 24 48 96 192 384 768 1536 * ``` * * --- * * ### with async scheduler * ```javascript * import { from } from 'rxjs/observable/from'; * import { async } from 'rxjs/scheduler/async'; * * console.log('start'); * * const array = [10, 20, 30]; * const result = from(array, async); * * result.subscribe(x => console.log(x)); * * console.log('end'); * * // Logs: * // start end 10 20 30 * ``` * * @see {@link fromEvent} * @see {@link fromEventPattern} * * @param {ObservableInput} A subscription object, a Promise, an Observable-like, * an Array, an iterable, or an array-like object to be converted. * @param {SchedulerLike} An optional {@link SchedulerLike} on which to schedule the emission of values. * @return {Observable} * @name from * @owner Observable */ export function from(input: ObservableInput, scheduler?: SchedulerLike): Observable { if (!scheduler) { if (input instanceof Observable) { return input; } return new Observable(subscribeTo(input)); } if (input != null) { if (isInteropObservable(input)) { return fromObservable(input, scheduler); } else if (isPromise(input)) { return fromPromise(input, scheduler); } else if (isArrayLike(input)) { return fromArray(input, scheduler); } else if (isIterable(input) || typeof input === 'string') { return fromIterable(input, scheduler); } } throw new TypeError((input !== null && typeof input || input) + ' is not observable'); }