1 import { Subscriber } from '../Subscriber';
2 import { Observable } from '../Observable';
3 import { OuterSubscriber } from '../OuterSubscriber';
4 import { subscribeToResult } from '../util/subscribeToResult';
5 export function delayWhen(delayDurationSelector, subscriptionDelay) {
6 if (subscriptionDelay) {
7 return (source) => new SubscriptionDelayObservable(source, subscriptionDelay)
8 .lift(new DelayWhenOperator(delayDurationSelector));
10 return (source) => source.lift(new DelayWhenOperator(delayDurationSelector));
12 class DelayWhenOperator {
13 constructor(delayDurationSelector) {
14 this.delayDurationSelector = delayDurationSelector;
16 call(subscriber, source) {
17 return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
20 class DelayWhenSubscriber extends OuterSubscriber {
21 constructor(destination, delayDurationSelector) {
23 this.delayDurationSelector = delayDurationSelector;
24 this.completed = false;
25 this.delayNotifierSubscriptions = [];
28 notifyNext(outerValue, _innerValue, _outerIndex, _innerIndex, innerSub) {
29 this.destination.next(outerValue);
30 this.removeSubscription(innerSub);
33 notifyError(error, innerSub) {
36 notifyComplete(innerSub) {
37 const value = this.removeSubscription(innerSub);
39 this.destination.next(value);
44 const index = this.index++;
46 const delayNotifier = this.delayDurationSelector(value, index);
48 this.tryDelay(delayNotifier, value);
52 this.destination.error(err);
56 this.completed = true;
60 removeSubscription(subscription) {
61 subscription.unsubscribe();
62 const subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
63 if (subscriptionIdx !== -1) {
64 this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
66 return subscription.outerValue;
68 tryDelay(delayNotifier, value) {
69 const notifierSubscription = subscribeToResult(this, delayNotifier, value);
70 if (notifierSubscription && !notifierSubscription.closed) {
71 const destination = this.destination;
72 destination.add(notifierSubscription);
73 this.delayNotifierSubscriptions.push(notifierSubscription);
77 if (this.completed && this.delayNotifierSubscriptions.length === 0) {
78 this.destination.complete();
82 class SubscriptionDelayObservable extends Observable {
83 constructor(source, subscriptionDelay) {
86 this.subscriptionDelay = subscriptionDelay;
88 _subscribe(subscriber) {
89 this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
92 class SubscriptionDelaySubscriber extends Subscriber {
93 constructor(parent, source) {
97 this.sourceSubscribed = false;
100 this.subscribeToSource();
104 this.parent.error(err);
108 this.subscribeToSource();
110 subscribeToSource() {
111 if (!this.sourceSubscribed) {
112 this.sourceSubscribed = true;
114 this.source.subscribe(this.parent);
118 //# sourceMappingURL=delayWhen.js.map