From 416fdcf20bae0b892a29dd7e562003c876b59aad Mon Sep 17 00:00:00 2001 From: Dmitry Vasilev Date: Fri, 16 Dec 2022 13:15:27 +0800 Subject: [PATCH] WIP --- src/patch_promise.js | 64 +++++++++++++++++++------------------------- test/test.js | 23 ++++++++++++++++ 2 files changed, 50 insertions(+), 37 deletions(-) diff --git a/src/patch_promise.js b/src/patch_promise.js index d7517c7..5748f5b 100644 --- a/src/patch_promise.js +++ b/src/patch_promise.js @@ -1,5 +1,5 @@ export const patch_promise = window => { - + if(window.Promise.Original != null) { // already patched return @@ -7,42 +7,32 @@ export const patch_promise = window => { class PromiseWithStatus extends Promise { constructor(fn) { - let status - let is_constructor_finished = false - super( - (resolve, reject) => { - fn( - (value) => { - if(value instanceof window.Promise.Original) { - value - .then(v => { - this.status = {ok: true, value: v} - resolve(v) - }) - .catch(e => { - this.status = {ok: false, error: e} - reject(e) - }) - } else { - status = {ok: true, value} - if(is_constructor_finished) { - this.status = status - } - resolve(value) - } - }, - (error) => { - status = {ok: false, error} - if(is_constructor_finished) { - this.status = status - } - reject(error) - }, - ) - } - ) - is_constructor_finished = true - this.status = status + const p = new Promise.Original((resolve, reject) => { + fn( + (value) => { + if(value instanceof window.Promise) { + value + .then(v => { + p.status = {ok: true, value: v} + resolve(v) + }) + .catch(e => { + p.status = {ok: false, error: e} + reject(e) + }) + } else { + p.status = {ok: true, value} + resolve(value) + } + }, + (error) => { + p.status = {ok: false, error} + reject(error) + }, + ) + }) + + return p } } diff --git a/test/test.js b/test/test.js index 5781c75..343c418 100644 --- a/test/test.js +++ b/test/test.js @@ -2612,6 +2612,15 @@ const y = x()` ) }), + test('async/await await Promise resolved immediately', async () => { + await assert_code_evals_to_async( + ` + await new Promise(resolve => resolve(1)) + `, + 1 + ) + }), + test('async/await return from async function', async () => { await assert_code_evals_to_async( ` @@ -2746,6 +2755,20 @@ const y = x()` assert_equal(logs, [1, 2]) }), + + /* TODO + test('p', async () => { + const i = await assert_code_evals_to_async(` + const res = Promise.resolve(1) + Object.assign(res, {mark: 'resolved'}) + await Object.assign(new Promise(resolve => resolve()), {mark: 'w'}) + `, + 1 + ) + + }), + */ + test('async/await logs out of order', async () => { const i = await test_initial_state_async(` // Init promises p1 and p2 that are resolved in different order (p2 then