diff --git a/src/vs/base/common/winjs.polyfill.promise.ts b/src/vs/base/common/winjs.polyfill.promise.ts index 65d46c7f076972909d74490bf749d3e8ad114258..2b6483ae28ba746c859a920680a47b6c70763af1 100644 --- a/src/vs/base/common/winjs.polyfill.promise.ts +++ b/src/vs/base/common/winjs.polyfill.promise.ts @@ -42,14 +42,14 @@ export class PolyfillPromise implements Promise { constructor(winjsPromise: WinJSPromise); constructor(callback: (resolve: (value?: T) => void, reject: (err?: any) => void) => any); - constructor(callback: WinJSPromise | ((resolve: (value?: T) => void, reject: (err?: any) => void) => any)) { + constructor(initOrPromise: WinJSPromise | ((resolve: (value?: T) => void, reject: (err?: any) => void) => any)) { - if (WinJSPromise.is(callback)) { - this._winjsPromise = callback; + if (WinJSPromise.is(initOrPromise)) { + this._winjsPromise = initOrPromise; } else { this._winjsPromise = new WinJSPromise((resolve, reject) => { let initializing = true; - callback(function (value) { + initOrPromise(function (value) { if (!initializing) { resolve(value); } else { @@ -68,10 +68,28 @@ export class PolyfillPromise implements Promise { } then(onFulfilled?: any, onRejected?: any): PolyfillPromise { - return new PolyfillPromise(this._winjsPromise.then(onFulfilled, onRejected)); + let sync = true; + let promise = new PolyfillPromise(this._winjsPromise.then( + onFulfilled && function (value) { + if (!sync) { + onFulfilled(value); + } else { + setImmediate(onFulfilled, value); + } + }, + onRejected && function (err) { + if (!sync) { + onFulfilled(err); + } else { + setImmediate(onFulfilled, err); + } + } + )); + sync = false; + return promise; } catch(onRejected?: any): PolyfillPromise { - return new PolyfillPromise(this._winjsPromise.then(null, onRejected)); + return this.then(null, onRejected); } } diff --git a/src/vs/base/test/common/winjs.polyfill.promise.test.ts b/src/vs/base/test/common/winjs.polyfill.promise.test.ts index 5114888d41931e02d4d5ec1ba0626324794f2849..0b60154b34561d4ed4eb0a49c72d11fd67062fdc 100644 --- a/src/vs/base/test/common/winjs.polyfill.promise.test.ts +++ b/src/vs/base/test/common/winjs.polyfill.promise.test.ts @@ -51,6 +51,33 @@ suite('Polyfill Promise', function () { }); }); + test('sync-then, NativePromise', function () { + const actual: string[] = []; + const promise = Promise.resolve(123).then(() => actual.push('inThen')); + actual.push('afterThen'); + return promise.then(() => { + assert.deepEqual(actual, ['afterThen', 'inThen']); + }); + }); + + test('sync-then, WinJSPromise', function () { + const actual: string[] = []; + const promise = WinJSPromise.as(123).then(() => actual.push('inThen')); + actual.push('afterThen'); + return promise.then(() => { + assert.deepEqual(actual, ['inThen', 'afterThen']); + }); + }); + + test('sync-then, PolyfillPromise', function () { + const actual: string[] = []; + const promise = PolyfillPromise.resolve(123).then(() => actual.push('inThen')); + actual.push('afterThen'); + return promise.then(() => { + assert.deepEqual(actual, ['afterThen', 'inThen']); + }); + }); + test('PolyfillPromise, executor has two params', function () { return new PolyfillPromise(function () { assert.equal(arguments.length, 2);