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.
		
		
		
		
			
				
					55 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					55 lines
				
				1.8 KiB
			| 
								 
											5 years ago
										 
									 | 
							
								import { Subscriber } from '../Subscriber';
							 | 
						||
| 
								 | 
							
								import { async } from '../scheduler/async';
							 | 
						||
| 
								 | 
							
								export function debounceTime(dueTime, scheduler = async) {
							 | 
						||
| 
								 | 
							
								    return (source) => source.lift(new DebounceTimeOperator(dueTime, scheduler));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								class DebounceTimeOperator {
							 | 
						||
| 
								 | 
							
								    constructor(dueTime, scheduler) {
							 | 
						||
| 
								 | 
							
								        this.dueTime = dueTime;
							 | 
						||
| 
								 | 
							
								        this.scheduler = scheduler;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    call(subscriber, source) {
							 | 
						||
| 
								 | 
							
								        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								class DebounceTimeSubscriber extends Subscriber {
							 | 
						||
| 
								 | 
							
								    constructor(destination, dueTime, scheduler) {
							 | 
						||
| 
								 | 
							
								        super(destination);
							 | 
						||
| 
								 | 
							
								        this.dueTime = dueTime;
							 | 
						||
| 
								 | 
							
								        this.scheduler = scheduler;
							 | 
						||
| 
								 | 
							
								        this.debouncedSubscription = null;
							 | 
						||
| 
								 | 
							
								        this.lastValue = null;
							 | 
						||
| 
								 | 
							
								        this.hasValue = false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    _next(value) {
							 | 
						||
| 
								 | 
							
								        this.clearDebounce();
							 | 
						||
| 
								 | 
							
								        this.lastValue = value;
							 | 
						||
| 
								 | 
							
								        this.hasValue = true;
							 | 
						||
| 
								 | 
							
								        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    _complete() {
							 | 
						||
| 
								 | 
							
								        this.debouncedNext();
							 | 
						||
| 
								 | 
							
								        this.destination.complete();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    debouncedNext() {
							 | 
						||
| 
								 | 
							
								        this.clearDebounce();
							 | 
						||
| 
								 | 
							
								        if (this.hasValue) {
							 | 
						||
| 
								 | 
							
								            const { lastValue } = this;
							 | 
						||
| 
								 | 
							
								            this.lastValue = null;
							 | 
						||
| 
								 | 
							
								            this.hasValue = false;
							 | 
						||
| 
								 | 
							
								            this.destination.next(lastValue);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    clearDebounce() {
							 | 
						||
| 
								 | 
							
								        const debouncedSubscription = this.debouncedSubscription;
							 | 
						||
| 
								 | 
							
								        if (debouncedSubscription !== null) {
							 | 
						||
| 
								 | 
							
								            this.remove(debouncedSubscription);
							 | 
						||
| 
								 | 
							
								            debouncedSubscription.unsubscribe();
							 | 
						||
| 
								 | 
							
								            this.debouncedSubscription = null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function dispatchNext(subscriber) {
							 | 
						||
| 
								 | 
							
								    subscriber.debouncedNext();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=debounceTime.js.map
							 |