diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index 8530b27f8e4ee171d090b6d7b5c9a837d90fed9b..1df045f333f199b2515e3116c8ac7861eba86cd0 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -26,8 +26,6 @@ export function toThenable(arg: T | Thenable): Thenable { export interface CancelablePromise extends Promise { cancel(): void; - cancelableThen(onFulfilled?: (value: T) => U | Thenable, onRejected?: (error: any) => U | Thenable): CancelablePromise; - cancelableThen(onFulfilled?: (value: T) => U | Thenable, onRejected?: (error: any) => void): CancelablePromise; } export function createCancelablePromise(callback: (token: CancellationToken) => Thenable): CancelablePromise { @@ -57,13 +55,6 @@ export function createCancelablePromise(callback: (token: CancellationToken) catch(reject?: ((reason: any) => TResult | Thenable) | undefined | null): Promise { return this.then(undefined, reject); } - cancelableThen(resolve?: ((value: T) => TResult1 | Thenable) | undefined | null, reject?: ((reason: any) => TResult2 | Thenable) | undefined | null): CancelablePromise { - return createCancelablePromise(token => { - const listener = token.onCancellationRequested(_ => this.cancel()); - always(promise, () => listener.dispose()); - return this.then(resolve, reject); - }); - } }; } @@ -383,14 +374,18 @@ export class ShallowCancelThenPromise extends TPromise { /** * Replacement for `WinJS.TPromise.timeout`. */ -export function timeout(n: number): CancelablePromise { - return createCancelablePromise(token => { - return new Promise((resolve, reject) => { - const handle = setTimeout(resolve, n); - token.onCancellationRequested(_ => { - clearTimeout(handle); - reject(errors.canceled()); - }); +export function timeout(millis: number): CancelablePromise; +export function timeout(millis: number, token: CancellationToken): Thenable; +export function timeout(millis: number, token?: CancellationToken): CancelablePromise | Thenable { + if (!token) { + return createCancelablePromise(token => timeout(millis, token)); + } + + return new Promise((resolve, reject) => { + const handle = setTimeout(resolve, millis); + token.onCancellationRequested(() => { + clearTimeout(handle); + reject(errors.canceled()); }); }); } diff --git a/src/vs/base/common/cache.ts b/src/vs/base/common/cache.ts index 68dbbfe38451cd74e403a07c65078052220ba032..2be451e2ebab140dfcea66c81ffb4dac31b373be 100644 --- a/src/vs/base/common/cache.ts +++ b/src/vs/base/common/cache.ts @@ -5,30 +5,34 @@ 'use strict'; -import { CancelablePromise } from 'vs/base/common/async'; +import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; +import { always } from 'vs/base/common/async'; export interface CacheResult { promise: Thenable; dispose(): void; } -export default class Cache { +export class Cache { private result: CacheResult = null; - constructor(private task: () => CancelablePromise) { } + constructor(private task: (ct: CancellationToken) => Thenable) { } get(): CacheResult { if (this.result) { return this.result; } - const promise = this.task(); + const cts = new CancellationTokenSource(); + const promise = this.task(cts.token); + always(promise, () => cts.dispose()); this.result = { promise, dispose: () => { this.result = null; - promise.cancel(); + cts.cancel(); + cts.dispose(); } }; diff --git a/src/vs/base/test/common/cache.test.ts b/src/vs/base/test/common/cache.test.ts index 2cf87a18efc47cd7b6d4544632cc580313b66f12..00304bdc0fba53277a971cd88a43222e7aef99e0 100644 --- a/src/vs/base/test/common/cache.test.ts +++ b/src/vs/base/test/common/cache.test.ts @@ -6,15 +6,15 @@ 'use strict'; import * as assert from 'assert'; -import Cache from 'vs/base/common/cache'; +import { Cache } from 'vs/base/common/cache'; import { TPromise } from 'vs/base/common/winjs.base'; -import { createCancelablePromise, timeout } from 'vs/base/common/async'; +import { timeout } from 'vs/base/common/async'; suite('Cache', () => { test('simple value', () => { let counter = 0; - const cache = new Cache(() => createCancelablePromise(_ => TPromise.as(counter++))); + const cache = new Cache(_ => TPromise.as(counter++)); return cache.get().promise .then(c => assert.equal(c, 0), () => assert.fail('Unexpected assertion error')) @@ -24,7 +24,7 @@ suite('Cache', () => { test('simple error', () => { let counter = 0; - const cache = new Cache(() => createCancelablePromise(_ => TPromise.wrapError(new Error(String(counter++))))); + const cache = new Cache(_ => TPromise.wrapError(new Error(String(counter++)))); return cache.get().promise .then(() => assert.fail('Unexpected assertion error'), err => assert.equal(err.message, 0)) @@ -35,9 +35,9 @@ suite('Cache', () => { test('should retry cancellations', () => { let counter1 = 0, counter2 = 0; - const cache = new Cache(() => { + const cache = new Cache(token => { counter1++; - return timeout(2).cancelableThen(() => counter2++); + return timeout(2, token).then(() => counter2++); }); assert.equal(counter1, 0); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 5b298a3f5a2ea45e99a44292cebc9302f7e7c000..300f7d75aae82d9db4069332bba324a8bcc2f658 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -13,7 +13,7 @@ import { createCancelablePromise, wireCancellationToken } from 'vs/base/common/a import * as arrays from 'vs/base/common/arrays'; import { OS } from 'vs/base/common/platform'; import { Event, Emitter, once, chain } from 'vs/base/common/event'; -import Cache, { CacheResult } from 'vs/base/common/cache'; +import { Cache, CacheResult } from 'vs/base/common/cache'; import { Action } from 'vs/base/common/actions'; import { isPromiseCanceledError } from 'vs/base/common/errors'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/search/node/rawSearchService.ts b/src/vs/workbench/services/search/node/rawSearchService.ts index bce0349fdd0d312bd3771ceaa2c41f02700d79d0..0e3f6d5c06887ce1184006753f12563f5d5c543c 100644 --- a/src/vs/workbench/services/search/node/rawSearchService.ts +++ b/src/vs/workbench/services/search/node/rawSearchService.ts @@ -456,9 +456,6 @@ export class SearchService implements IRawSearchService { catch(reject?) { return this.then(undefined, reject); } - cancelableThen(resolve, reject) { - return createCancelablePromise(_ => this.then(resolve, reject)); - } }; } }