@reactivex/rxjs
Version:
Reactive Extensions for modern JavaScript
76 lines (65 loc) • 2.2 kB
text/typescript
import { Observable } from '../Observable';
import { IScheduler } from '../Scheduler';
import { Operator } from '../Operator';
import { PartialObserver } from '../Observer';
import { Subscriber } from '../Subscriber';
import { Notification } from '../Notification';
import { TeardownLogic } from '../Subscription';
import { Action } from '../scheduler/Action';
/**
* @see {@link Notification}
*
* @param scheduler
* @param delay
* @return {Observable<R>|WebSocketSubject<T>|Observable<T>}
* @method observeOn
* @owner Observable
*/
export function observeOn<T>(this: Observable<T>, scheduler: IScheduler, delay: number = 0): Observable<T> {
return this.lift(new ObserveOnOperator(scheduler, delay));
}
export class ObserveOnOperator<T> implements Operator<T, T> {
constructor(private scheduler: IScheduler, private delay: number = 0) {
}
call(subscriber: Subscriber<T>, source: any): TeardownLogic {
return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
}
}
/**
* We need this JSDoc comment for affecting ESDoc.
* @ignore
* @extends {Ignored}
*/
export class ObserveOnSubscriber<T> extends Subscriber<T> {
static dispatch(this: Action<ObserveOnMessage>, arg: ObserveOnMessage) {
const { notification, destination } = arg;
notification.observe(destination);
this.unsubscribe();
}
constructor(destination: Subscriber<T>,
private scheduler: IScheduler,
private delay: number = 0) {
super(destination);
}
private scheduleMessage(notification: Notification<any>): void {
this.add(this.scheduler.schedule(
ObserveOnSubscriber.dispatch,
this.delay,
new ObserveOnMessage(notification, this.destination)
));
}
protected _next(value: T): void {
this.scheduleMessage(Notification.createNext(value));
}
protected _error(err: any): void {
this.scheduleMessage(Notification.createError(err));
}
protected _complete(): void {
this.scheduleMessage(Notification.createComplete());
}
}
export class ObserveOnMessage {
constructor(public notification: Notification<any>,
public destination: PartialObserver<any>) {
}
}