Skip to content

Commit 0979d31

Browse files
kwonojbenlesh
authored andcommitted
feat(delayWhen): add index to the selector function (#2473)
1 parent d8231e2 commit 0979d31

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

spec/operators/delayWhen-spec.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { of, EMPTY } from 'rxjs';
2-
import { delayWhen } from 'rxjs/operators';
2+
import { delayWhen, tap } from 'rxjs/operators';
33
import { TestScheduler } from 'rxjs/testing';
44
import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing';
55
import { expect } from 'chai';
@@ -249,4 +249,24 @@ describe('delayWhen operator', () => {
249249
expect(next).to.be.true;
250250
expect(complete).to.be.true;
251251
});
252+
253+
it('should call predicate with indices starting at 0', () => {
254+
const e1 = hot('--a--b--c--|');
255+
const expected = '--a--b--c--|';
256+
const selector = cold('(x|)');
257+
258+
let indices: number[] = [];
259+
const predicate = (value: string, index: number) => {
260+
indices.push(index);
261+
return selector;
262+
};
263+
264+
const result = e1.pipe(delayWhen(predicate));
265+
266+
expectObservable(result.pipe(
267+
tap(null, null, () => {
268+
expect(indices).to.deep.equal([0, 1, 2]);
269+
})
270+
)).toBe(expected);
271+
});
252272
});

src/internal/operators/delayWhen.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
99

1010
/* tslint:disable:max-line-length */
1111
/** @deprecated In future versions, empty notifiers will no longer re-emit the source value on the output observable. */
12-
export function delayWhen<T>(delayDurationSelector: (value: T) => Observable<never>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>;
13-
export function delayWhen<T>(delayDurationSelector: (value: T) => Observable<any>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>;
12+
export function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<never>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>;
13+
export function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<any>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>;
1414
/* tslint:disable:max-line-length */
1515

1616
/**
@@ -51,7 +51,7 @@ export function delayWhen<T>(delayDurationSelector: (value: T) => Observable<any
5151
* @see {@link debounce}
5252
* @see {@link delay}
5353
*
54-
* @param {function(value: T): Observable} delayDurationSelector A function that
54+
* @param {function(value: T, index: number): Observable} delayDurationSelector A function that
5555
* returns an Observable for each value emitted by the source Observable, which
5656
* is then used to delay the emission of that item on the output Observable
5757
* until the Observable returned from this function emits a value.
@@ -63,7 +63,7 @@ export function delayWhen<T>(delayDurationSelector: (value: T) => Observable<any
6363
* @method delayWhen
6464
* @owner Observable
6565
*/
66-
export function delayWhen<T>(delayDurationSelector: (value: T) => Observable<any>,
66+
export function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<any>,
6767
subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T> {
6868
if (subscriptionDelay) {
6969
return (source: Observable<T>) =>
@@ -74,7 +74,7 @@ export function delayWhen<T>(delayDurationSelector: (value: T) => Observable<any
7474
}
7575

7676
class DelayWhenOperator<T> implements Operator<T, T> {
77-
constructor(private delayDurationSelector: (value: T) => Observable<any>) {
77+
constructor(private delayDurationSelector: (value: T, index: number) => Observable<any>) {
7878
}
7979

8080
call(subscriber: Subscriber<T>, source: any): TeardownLogic {
@@ -90,9 +90,10 @@ class DelayWhenOperator<T> implements Operator<T, T> {
9090
class DelayWhenSubscriber<T, R> extends OuterSubscriber<T, R> {
9191
private completed: boolean = false;
9292
private delayNotifierSubscriptions: Array<Subscription> = [];
93+
private index: number = 0;
9394

9495
constructor(destination: Subscriber<T>,
95-
private delayDurationSelector: (value: T) => Observable<any>) {
96+
private delayDurationSelector: (value: T, index: number) => Observable<any>) {
9697
super(destination);
9798
}
9899

@@ -117,8 +118,9 @@ class DelayWhenSubscriber<T, R> extends OuterSubscriber<T, R> {
117118
}
118119

119120
protected _next(value: T): void {
121+
const index = this.index++;
120122
try {
121-
const delayNotifier = this.delayDurationSelector(value);
123+
const delayNotifier = this.delayDurationSelector(value, index);
122124
if (delayNotifier) {
123125
this.tryDelay(delayNotifier, value);
124126
}

0 commit comments

Comments
 (0)