You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.3 KiB
124 lines
4.3 KiB
import { Observable } from './Observable'; |
|
/** |
|
* Represents a push-based event or value that an {@link Observable} can emit. |
|
* This class is particularly useful for operators that manage notifications, |
|
* like {@link materialize}, {@link dematerialize}, {@link observeOn}, and |
|
* others. Besides wrapping the actual delivered value, it also annotates it |
|
* with metadata of, for instance, what type of push message it is (`next`, |
|
* `error`, or `complete`). |
|
* |
|
* @see {@link materialize} |
|
* @see {@link dematerialize} |
|
* @see {@link observeOn} |
|
* |
|
* @class Notification<T> |
|
*/ |
|
export class Notification { |
|
constructor(kind, value, error) { |
|
this.kind = kind; |
|
this.value = value; |
|
this.error = error; |
|
this.hasValue = kind === 'N'; |
|
} |
|
/** |
|
* Delivers to the given `observer` the value wrapped by this Notification. |
|
* @param {Observer} observer |
|
* @return |
|
*/ |
|
observe(observer) { |
|
switch (this.kind) { |
|
case 'N': |
|
return observer.next && observer.next(this.value); |
|
case 'E': |
|
return observer.error && observer.error(this.error); |
|
case 'C': |
|
return observer.complete && observer.complete(); |
|
} |
|
} |
|
/** |
|
* Given some {@link Observer} callbacks, deliver the value represented by the |
|
* current Notification to the correctly corresponding callback. |
|
* @param {function(value: T): void} next An Observer `next` callback. |
|
* @param {function(err: any): void} [error] An Observer `error` callback. |
|
* @param {function(): void} [complete] An Observer `complete` callback. |
|
* @return {any} |
|
*/ |
|
do(next, error, complete) { |
|
const kind = this.kind; |
|
switch (kind) { |
|
case 'N': |
|
return next && next(this.value); |
|
case 'E': |
|
return error && error(this.error); |
|
case 'C': |
|
return complete && complete(); |
|
} |
|
} |
|
/** |
|
* Takes an Observer or its individual callback functions, and calls `observe` |
|
* or `do` methods accordingly. |
|
* @param {Observer|function(value: T): void} nextOrObserver An Observer or |
|
* the `next` callback. |
|
* @param {function(err: any): void} [error] An Observer `error` callback. |
|
* @param {function(): void} [complete] An Observer `complete` callback. |
|
* @return {any} |
|
*/ |
|
accept(nextOrObserver, error, complete) { |
|
if (nextOrObserver && typeof nextOrObserver.next === 'function') { |
|
return this.observe(nextOrObserver); |
|
} |
|
else { |
|
return this.do(nextOrObserver, error, complete); |
|
} |
|
} |
|
/** |
|
* Returns a simple Observable that just delivers the notification represented |
|
* by this Notification instance. |
|
* @return {any} |
|
*/ |
|
toObservable() { |
|
const kind = this.kind; |
|
switch (kind) { |
|
case 'N': |
|
return Observable.of(this.value); |
|
case 'E': |
|
return Observable.throw(this.error); |
|
case 'C': |
|
return Observable.empty(); |
|
} |
|
throw new Error('unexpected notification kind value'); |
|
} |
|
/** |
|
* A shortcut to create a Notification instance of the type `next` from a |
|
* given value. |
|
* @param {T} value The `next` value. |
|
* @return {Notification<T>} The "next" Notification representing the |
|
* argument. |
|
*/ |
|
static createNext(value) { |
|
if (typeof value !== 'undefined') { |
|
return new Notification('N', value); |
|
} |
|
return Notification.undefinedValueNotification; |
|
} |
|
/** |
|
* A shortcut to create a Notification instance of the type `error` from a |
|
* given error. |
|
* @param {any} [err] The `error` error. |
|
* @return {Notification<T>} The "error" Notification representing the |
|
* argument. |
|
*/ |
|
static createError(err) { |
|
return new Notification('E', undefined, err); |
|
} |
|
/** |
|
* A shortcut to create a Notification instance of the type `complete`. |
|
* @return {Notification<any>} The valueless "complete" Notification. |
|
*/ |
|
static createComplete() { |
|
return Notification.completeNotification; |
|
} |
|
} |
|
Notification.completeNotification = new Notification('C'); |
|
Notification.undefinedValueNotification = new Notification('N', undefined); |
|
//# sourceMappingURL=Notification.js.map
|