Skip to content

Commit bd55fd8

Browse files
committed
remove cancelableThen, overload timeout
1 parent e34efce commit bd55fd8

5 files changed

Lines changed: 28 additions & 32 deletions

File tree

src/vs/base/common/async.ts

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ export function toThenable<T>(arg: T | Thenable<T>): Thenable<T> {
2626

2727
export interface CancelablePromise<T> extends Promise<T> {
2828
cancel(): void;
29-
cancelableThen<U>(onFulfilled?: (value: T) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): CancelablePromise<U>;
30-
cancelableThen<U>(onFulfilled?: (value: T) => U | Thenable<U>, onRejected?: (error: any) => void): CancelablePromise<U>;
3129
}
3230

3331
export function createCancelablePromise<T>(callback: (token: CancellationToken) => Thenable<T>): CancelablePromise<T> {
@@ -57,13 +55,6 @@ export function createCancelablePromise<T>(callback: (token: CancellationToken)
5755
catch<TResult = never>(reject?: ((reason: any) => TResult | Thenable<TResult>) | undefined | null): Promise<T | TResult> {
5856
return this.then(undefined, reject);
5957
}
60-
cancelableThen<TResult1 = T, TResult2 = never>(resolve?: ((value: T) => TResult1 | Thenable<TResult1>) | undefined | null, reject?: ((reason: any) => TResult2 | Thenable<TResult2>) | undefined | null): CancelablePromise<TResult1 | TResult2> {
61-
return createCancelablePromise<TResult1 | TResult2>(token => {
62-
const listener = token.onCancellationRequested(_ => this.cancel());
63-
always(promise, () => listener.dispose());
64-
return this.then(resolve, reject);
65-
});
66-
}
6758
};
6859
}
6960

@@ -383,14 +374,18 @@ export class ShallowCancelThenPromise<T> extends TPromise<T> {
383374
/**
384375
* Replacement for `WinJS.TPromise.timeout`.
385376
*/
386-
export function timeout(n: number): CancelablePromise<void> {
387-
return createCancelablePromise(token => {
388-
return new Promise((resolve, reject) => {
389-
const handle = setTimeout(resolve, n);
390-
token.onCancellationRequested(_ => {
391-
clearTimeout(handle);
392-
reject(errors.canceled());
393-
});
377+
export function timeout(millis: number): CancelablePromise<void>;
378+
export function timeout(millis: number, token: CancellationToken): Thenable<void>;
379+
export function timeout(millis: number, token?: CancellationToken): CancelablePromise<void> | Thenable<void> {
380+
if (!token) {
381+
return createCancelablePromise(token => timeout(millis, token));
382+
}
383+
384+
return new Promise((resolve, reject) => {
385+
const handle = setTimeout(resolve, millis);
386+
token.onCancellationRequested(() => {
387+
clearTimeout(handle);
388+
reject(errors.canceled());
394389
});
395390
});
396391
}

src/vs/base/common/cache.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,34 @@
55

66
'use strict';
77

8-
import { CancelablePromise } from 'vs/base/common/async';
8+
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
9+
import { always } from 'vs/base/common/async';
910

1011
export interface CacheResult<T> {
1112
promise: Thenable<T>;
1213
dispose(): void;
1314
}
1415

15-
export default class Cache<T> {
16+
export class Cache<T> {
1617

1718
private result: CacheResult<T> = null;
18-
constructor(private task: () => CancelablePromise<T>) { }
19+
constructor(private task: (ct: CancellationToken) => Thenable<T>) { }
1920

2021
get(): CacheResult<T> {
2122
if (this.result) {
2223
return this.result;
2324
}
2425

25-
const promise = this.task();
26+
const cts = new CancellationTokenSource();
27+
const promise = this.task(cts.token);
28+
always(promise, () => cts.dispose());
2629

2730
this.result = {
2831
promise,
2932
dispose: () => {
3033
this.result = null;
31-
promise.cancel();
34+
cts.cancel();
35+
cts.dispose();
3236
}
3337
};
3438

src/vs/base/test/common/cache.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
'use strict';
77

88
import * as assert from 'assert';
9-
import Cache from 'vs/base/common/cache';
9+
import { Cache } from 'vs/base/common/cache';
1010
import { TPromise } from 'vs/base/common/winjs.base';
11-
import { createCancelablePromise, timeout } from 'vs/base/common/async';
11+
import { timeout } from 'vs/base/common/async';
1212

1313
suite('Cache', () => {
1414

1515
test('simple value', () => {
1616
let counter = 0;
17-
const cache = new Cache(() => createCancelablePromise(_ => TPromise.as(counter++)));
17+
const cache = new Cache(_ => TPromise.as(counter++));
1818

1919
return cache.get().promise
2020
.then(c => assert.equal(c, 0), () => assert.fail('Unexpected assertion error'))
@@ -24,7 +24,7 @@ suite('Cache', () => {
2424

2525
test('simple error', () => {
2626
let counter = 0;
27-
const cache = new Cache(() => createCancelablePromise(_ => TPromise.wrapError(new Error(String(counter++)))));
27+
const cache = new Cache(_ => TPromise.wrapError(new Error(String(counter++))));
2828

2929
return cache.get().promise
3030
.then(() => assert.fail('Unexpected assertion error'), err => assert.equal(err.message, 0))
@@ -35,9 +35,9 @@ suite('Cache', () => {
3535
test('should retry cancellations', () => {
3636
let counter1 = 0, counter2 = 0;
3737

38-
const cache = new Cache(() => {
38+
const cache = new Cache(token => {
3939
counter1++;
40-
return timeout(2).cancelableThen(() => counter2++);
40+
return timeout(2, token).then(() => counter2++);
4141
});
4242

4343
assert.equal(counter1, 0);

src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { createCancelablePromise, wireCancellationToken } from 'vs/base/common/a
1313
import * as arrays from 'vs/base/common/arrays';
1414
import { OS } from 'vs/base/common/platform';
1515
import { Event, Emitter, once, chain } from 'vs/base/common/event';
16-
import Cache, { CacheResult } from 'vs/base/common/cache';
16+
import { Cache, CacheResult } from 'vs/base/common/cache';
1717
import { Action } from 'vs/base/common/actions';
1818
import { isPromiseCanceledError } from 'vs/base/common/errors';
1919
import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle';

src/vs/workbench/services/search/node/rawSearchService.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -456,9 +456,6 @@ export class SearchService implements IRawSearchService {
456456
catch(reject?) {
457457
return this.then(undefined, reject);
458458
}
459-
cancelableThen(resolve, reject) {
460-
return createCancelablePromise(_ => this.then(resolve, reject));
461-
}
462459
};
463460
}
464461
}

0 commit comments

Comments
 (0)