| /* |
| * This file and its definitions are needed just so that ESDoc sees these |
| * JSDoc documentation comments. Originally they were meant for some TypeScript |
| * interfaces, but TypeScript strips away JSDoc comments near interfaces. Hence, |
| * we need these bogus classes, which are not stripped away. This file on the |
| * other hand, is not included in the release bundle. |
| */ |
| import { Observer, TeardownLogic } from './internal/types'; |
| import { Observable } from './internal/Observable'; |
| import './internal/observable/dom/MiscJSDoc'; |
| |
| /** |
| * We need this JSDoc comment for affecting ESDoc. |
| * @extends {Ignored} |
| * @hide true |
| */ |
| export class ObservableDoc { |
| /** |
| * Creates a new Observable, that will execute the specified function when an |
| * {@link Observer} subscribes to it. |
| * |
| * <span class="informal">Create custom Observable, that does whatever you like.</span> |
| * |
| *  |
| * |
| * `create` converts an `onSubscription` function to an actual Observable. |
| * Whenever someone subscribes to that Observable, the function will be called |
| * with an {@link Observer} instance as a first and only parameter. `onSubscription` should |
| * then invoke the Observers `next`, `error` and `complete` methods. |
| * |
| * Calling `next` with a value will emit that value to the observer. Calling `complete` |
| * means that Observable finished emitting and will not do anything else. |
| * Calling `error` means that something went wrong - value passed to `error` method should |
| * provide details on what exactly happened. |
| * |
| * A well-formed Observable can emit as many values as it needs via `next` method, |
| * but `complete` and `error` methods can be called only once and nothing else can be called |
| * thereafter. If you try to invoke `next`, `complete` or `error` methods after created |
| * Observable already completed or ended with an error, these calls will be ignored to |
| * preserve so called *Observable Contract*. Note that you are not required to call |
| * `complete` at any point - it is perfectly fine to create an Observable that never ends, |
| * depending on your needs. |
| * |
| * `onSubscription` can optionally return either a function or an object with |
| * `unsubscribe` method. In both cases function or method will be called when |
| * subscription to Observable is being cancelled and should be used to clean up all |
| * resources. So, for example, if you are using `setTimeout` in your custom |
| * Observable, when someone unsubscribes, you can clear planned timeout, so that |
| * it does not fire needlessly and browser (or other environment) does not waste |
| * computing power on timing event that no one will listen to anyways. |
| * |
| * Most of the times you should not need to use `create`, because existing |
| * operators allow you to create an Observable for most of the use cases. |
| * That being said, `create` is low-level mechanism allowing you to create |
| * any Observable, if you have very specific needs. |
| * |
| * **TypeScript signature issue** |
| * |
| * Because Observable extends class which already has defined static `create` function, |
| * but with different type signature, it was impossible to assign proper signature to |
| * `Observable.create`. Because of that, it has very general type `Function` and thus |
| * function passed to `create` will not be type checked, unless you explicitly state |
| * what signature it should have. |
| * |
| * When using TypeScript we recommend to declare type signature of function passed to |
| * `create` as `(observer: Observer) => TeardownLogic`, where {@link Observer} |
| * and {@link TeardownLogic} are interfaces provided by the library. |
| * |
| * @example <caption>Emit three numbers, then complete.</caption> |
| * var observable = Rx.Observable.create(function (observer) { |
| * observer.next(1); |
| * observer.next(2); |
| * observer.next(3); |
| * observer.complete(); |
| * }); |
| * observable.subscribe( |
| * value => console.log(value), |
| * err => {}, |
| * () => console.log('this is the end') |
| * ); |
| * |
| * // Logs |
| * // 1 |
| * // 2 |
| * // 3 |
| * // "this is the end" |
| * |
| * |
| * @example <caption>Emit an error</caption> |
| * const observable = Rx.Observable.create((observer) => { |
| * observer.error('something went really wrong...'); |
| * }); |
| * |
| * observable.subscribe( |
| * value => console.log(value), // will never be called |
| * err => console.log(err), |
| * () => console.log('complete') // will never be called |
| * ); |
| * |
| * // Logs |
| * // "something went really wrong..." |
| * |
| * |
| * @example <caption>Return unsubscribe function</caption> |
| * |
| * const observable = Rx.Observable.create(observer => { |
| * const id = setTimeout(() => observer.next('...'), 5000); // emit value after 5s |
| * |
| * return () => { clearTimeout(id); console.log('cleared!'); }; |
| * }); |
| * |
| * const subscription = observable.subscribe(value => console.log(value)); |
| * |
| * setTimeout(() => subscription.unsubscribe(), 3000); // cancel subscription after 3s |
| * |
| * // Logs: |
| * // "cleared!" after 3s |
| * |
| * // Never logs "..." |
| * |
| * |
| * @see {@link empty} |
| * @see {@link never} |
| * @see {@link of} |
| * @see {@link throw} |
| * |
| * @param {function(observer: Observer): TeardownLogic} onSubscription A |
| * function that accepts an Observer, and invokes its `next`, |
| * `error`, and `complete` methods as appropriate, and optionally returns some |
| * logic for cleaning up resources. |
| * @return {Observable} An Observable that, whenever subscribed, will execute the |
| * specified function. |
| * @static true |
| * @name create |
| * @owner Observable |
| * @nocollapse |
| */ |
| static create<T>(onSubscription: <R>(observer: Observer<R>) => TeardownLogic): Observable<T> { |
| return new Observable<T>(onSubscription); |
| } |
| } |
| |
| /** |
| * An interface for a consumer of push-based notifications delivered by an |
| * {@link Observable}. |
| * |
| * ```ts |
| * interface Observer<T> { |
| * closed?: boolean; |
| * next: (value: T) => void; |
| * error: (err: any) => void; |
| * complete: () => void; |
| * } |
| * ``` |
| * |
| * An object conforming to the Observer interface is usually |
| * given to the `observable.subscribe(observer)` method, and the Observable will |
| * call the Observer's `next(value)` method to provide notifications. A |
| * well-behaved Observable will call an Observer's `complete()` method exactly |
| * once or the Observer's `error(err)` method exactly once, as the last |
| * notification delivered. |
| * |
| * @interface |
| * @name Observer |
| * @noimport true |
| */ |
| export class ObserverDoc<T> { |
| /** |
| * An optional flag to indicate whether this Observer, when used as a |
| * subscriber, has already been unsubscribed from its Observable. |
| * @type {boolean} |
| */ |
| closed: boolean = false; |
| /** |
| * The callback to receive notifications of type `next` from the Observable, |
| * with a value. The Observable may call this method 0 or more times. |
| * @param {T} value The `next` value. |
| * @return {void} |
| */ |
| next(value: T): void { |
| return void 0; |
| } |
| /** |
| * The callback to receive notifications of type `error` from the Observable, |
| * with an attached {@link Error}. Notifies the Observer that the Observable |
| * has experienced an error condition. |
| * @param {any} err The `error` exception. |
| * @return {void} |
| */ |
| error(err: any): void { |
| return void 0; |
| } |
| /** |
| * The callback to receive a valueless notification of type `complete` from |
| * the Observable. Notifies the Observer that the Observable has finished |
| * sending push-based notifications. |
| * @return {void} |
| */ |
| complete(): void { |
| return void 0; |
| } |
| } |
| |
| /** |
| * `SubscribableOrPromise` interface describes values that behave like either |
| * Observables or Promises. Every operator that accepts arguments annotated |
| * with this interface, can be also used with parameters that are not necessarily |
| * RxJS Observables. |
| * |
| * Following types of values might be passed to operators expecting this interface: |
| * |
| * ## Observable |
| * |
| * RxJS {@link Observable} instance. |
| * |
| * ## Observable-like (Subscribable) |
| * |
| * This might be any object that has `Symbol.observable` method. This method, |
| * when called, should return object with `subscribe` method on it, which should |
| * behave the same as RxJS `Observable.subscribe`. |
| * |
| * `Symbol.observable` is part of https://github.com/tc39/proposal-observable proposal. |
| * Since currently it is not supported natively, and every symbol is equal only to itself, |
| * you should use https://github.com/blesh/symbol-observable polyfill, when implementing |
| * custom Observable-likes. |
| * |
| * **TypeScript Subscribable interface issue** |
| * |
| * Although TypeScript interface claims that Subscribable is an object that has `subscribe` |
| * method declared directly on it, passing custom objects that have `subscribe` |
| * method but not `Symbol.observable` method will fail at runtime. Conversely, passing |
| * objects with `Symbol.observable` but without `subscribe` will fail at compile time |
| * (if you use TypeScript). |
| * |
| * TypeScript has problem supporting interfaces with methods defined as symbol |
| * properties. To get around that, you should implement `subscribe` directly on |
| * passed object, and make `Symbol.observable` method simply return `this`. That way |
| * everything will work as expected, and compiler will not complain. If you really |
| * do not want to put `subscribe` directly on your object, you will have to type cast |
| * it to `any`, before passing it to an operator. |
| * |
| * When this issue is resolved, Subscribable interface will only permit Observable-like |
| * objects with `Symbol.observable` defined, no matter if they themselves implement |
| * `subscribe` method or not. |
| * |
| * ## ES6 Promise |
| * |
| * Promise can be interpreted as Observable that emits value and completes |
| * when it is resolved or errors when it is rejected. |
| * |
| * ## Promise-like (Thenable) |
| * |
| * Promises passed to operators do not have to be native ES6 Promises. |
| * They can be implementations from popular Promise libraries, polyfills |
| * or even custom ones. They just need to have `then` method that works |
| * as the same as ES6 Promise `then`. |
| * |
| * @example <caption>Use merge and then map with non-RxJS observable</caption> |
| * const nonRxJSObservable = { |
| * subscribe(observer) { |
| * observer.next(1000); |
| * observer.complete(); |
| * }, |
| * [Symbol.observable]() { |
| * return this; |
| * } |
| * }; |
| * |
| * Rx.Observable.merge(nonRxJSObservable) |
| * .map(value => "This value is " + value) |
| * .subscribe(result => console.log(result)); // Logs "This value is 1000" |
| * |
| * |
| * @example <caption>Use combineLatest with ES6 Promise</caption> |
| * Rx.Observable.combineLatest(Promise.resolve(5), Promise.resolve(10), Promise.resolve(15)) |
| * .subscribe( |
| * value => console.log(value), |
| * err => {}, |
| * () => console.log('the end!') |
| * ); |
| * // Logs |
| * // [5, 10, 15] |
| * // "the end!" |
| * |
| * |
| * @interface |
| * @name SubscribableOrPromise |
| * @noimport true |
| */ |
| export class SubscribableOrPromiseDoc<T> { |
| |
| } |
| |
| /** |
| * `ObservableInput` interface describes all values that are either an |
| * {@link SubscribableOrPromise} or some kind of collection of values that |
| * can be transformed to Observable emitting that values. Every operator that |
| * accepts arguments annotated with this interface, can be also used with |
| * parameters that are not necessarily RxJS Observables. |
| * |
| * `ObservableInput` extends {@link SubscribableOrPromise} with following types: |
| * |
| * ## Array |
| * |
| * Arrays can be interpreted as observables that emit all values in array one by one, |
| * from left to right, and then complete immediately. |
| * |
| * ## Array-like |
| * |
| * Arrays passed to operators do not have to be built-in JavaScript Arrays. They |
| * can be also, for example, `arguments` property available inside every function, |
| * [DOM NodeList](https://developer.mozilla.org/pl/docs/Web/API/NodeList), |
| * or, actually, any object that has `length` property (which is a number) |
| * and stores values under non-negative (zero and up) integers. |
| * |
| * ## ES6 Iterable |
| * |
| * Operators will accept both built-in and custom ES6 Iterables, by treating them as |
| * observables that emit all its values in order of iteration and then complete |
| * when iteration ends. Note that contrary to arrays, Iterables do not have to |
| * necessarily be finite, so creating Observables that never complete is possible as well. |
| * |
| * Note that you can make iterator an instance of Iterable by having it return itself |
| * in `Symbol.iterator` method. It means that every operator accepting Iterables accepts, |
| * though indirectly, iterators themselves as well. All native ES6 iterators are instances |
| * of Iterable by default, so you do not have to implement their `Symbol.iterator` method |
| * yourself. |
| * |
| * **TypeScript Iterable interface issue** |
| * |
| * TypeScript `ObservableInput` interface actually lacks type signature for Iterables, |
| * because of issues it caused in some projects (see [this issue](https://github.com/ReactiveX/rxjs/issues/2306)). |
| * If you want to use Iterable as argument for operator, cast it to `any` first. |
| * Remember of course that, because of casting, you have to yourself ensure that passed |
| * argument really implements said interface. |
| * |
| * |
| * @example <caption>Use merge with arrays</caption> |
| * Rx.Observable.merge([1, 2], [4], [5, 6]) |
| * .subscribe( |
| * value => console.log(value), |
| * err => {}, |
| * () => console.log('ta dam!') |
| * ); |
| * |
| * // Logs |
| * // 1 |
| * // 2 |
| * // 3 |
| * // 4 |
| * // 5 |
| * // 6 |
| * // "ta dam!" |
| * |
| * |
| * @example <caption>Use merge with array-like</caption> |
| * Rx.Observable.merge({0: 1, 1: 2, length: 2}, {0: 3, length: 1}) |
| * .subscribe( |
| * value => console.log(value), |
| * err => {}, |
| * () => console.log('nice, huh?') |
| * ); |
| * |
| * // Logs |
| * // 1 |
| * // 2 |
| * // 3 |
| * // "nice, huh?" |
| * |
| * @example <caption>Use merge with an Iterable (Map)</caption> |
| * const firstMap = new Map([[1, 'a'], [2, 'b']]); |
| * const secondMap = new Map([[3, 'c'], [4, 'd']]); |
| * |
| * Rx.Observable.merge( |
| * firstMap, // pass Iterable |
| * secondMap.values() // pass iterator, which is itself an Iterable |
| * ).subscribe( |
| * value => console.log(value), |
| * err => {}, |
| * () => console.log('yup!') |
| * ); |
| * |
| * // Logs |
| * // [1, "a"] |
| * // [2, "b"] |
| * // "c" |
| * // "d" |
| * // "yup!" |
| * |
| * @example <caption>Use from with generator (returning infinite iterator)</caption> |
| * // infinite stream of incrementing numbers |
| * const infinite = function* () { |
| * let i = 0; |
| * |
| * while (true) { |
| * yield i++; |
| * } |
| * }; |
| * |
| * Rx.Observable.from(infinite()) |
| * .take(3) // only take 3, cause this is infinite |
| * .subscribe( |
| * value => console.log(value), |
| * err => {}, |
| * () => console.log('ta dam!') |
| * ); |
| * |
| * // Logs |
| * // 0 |
| * // 1 |
| * // 2 |
| * // "ta dam!" |
| * |
| * @interface |
| * @name ObservableInput |
| * @noimport true |
| */ |
| export class ObservableInputDoc<T> { |
| |
| } |
| |
| /** |
| * |
| * This interface describes what should be returned by function passed to Observable |
| * constructor or static {@link create} function. Value of that interface will be used |
| * to cancel subscription for given Observable. |
| * |
| * `TeardownLogic` can be: |
| * |
| * ## Function |
| * |
| * Function that takes no parameters. When consumer of created Observable calls `unsubscribe`, |
| * that function will be called |
| * |
| * ## AnonymousSubscription |
| * |
| * `AnonymousSubscription` is simply an object with `unsubscribe` method on it. That method |
| * will work the same as function |
| * |
| * ## void |
| * |
| * If created Observable does not have any resources to clean up, function does not have to |
| * return anything. |
| * |
| * @interface |
| * @name TeardownLogic |
| * @noimport true |
| */ |
| export class TeardownLogicDoc { |
| |
| } |