diff --git a/src/patch_promise.js b/src/patch_promise.js index 5748f5b..04036b8 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,31 +7,42 @@ export const patch_promise = window => { class PromiseWithStatus extends Promise { constructor(fn) { - 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) - }, - ) - }) - + let status + let is_constructor_finished = false + const p = new Promise.Original( + (resolve, reject) => { + fn( + (value) => { + if(value instanceof window.Promise.Original) { + value + .then(v => { + p.status = {ok: true, value: v} + resolve(v) + }) + .catch(e => { + p.status = {ok: false, error: e} + reject(e) + }) + } else { + status = {ok: true, value} + if(is_constructor_finished) { + p.status = status + } + resolve(value) + } + }, + (error) => { + status = {ok: false, error} + if(is_constructor_finished) { + p.status = status + } + reject(error) + }, + ) + } + ) + is_constructor_finished = true + p.status = status return p } } diff --git a/test/test.js b/test/test.js index 343c418..d530045 100644 --- a/test/test.js +++ b/test/test.js @@ -2724,15 +2724,10 @@ const y = x()` const i = await test_initial_state_async(` const x = () => 1 const delay = async time => { - await 1 //TODO Promise.resolve() + await 1 x() } await delay(3) - /* TODO - await Promise.all([ - delay(3), - ]) - */ `) const root = root_calltree_node(i) assert_equal(root.children.length, 1) @@ -2741,34 +2736,6 @@ const y = x()` assert_equal(call_delay.fn.name, 'delay') }), - // TODO - test('async/await logs out of order', async () => { - const i = await test_initial_state_async(` - const delay = async time => { - await new Promise(res => globalThis.setTimeout(res, time*10)) - console.log(time) - } - - await Promise.all([delay(2), delay(1)]) - `) - const logs = i.logs.logs.map(l => l.args[0]) - 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 @@ -2787,4 +2754,17 @@ const y = x()` assert_equal(logs, [2, 1]) }), + test('async/await logs out of order', async () => { + const i = await test_initial_state_async(` + const delay = async time => { + await new Promise(res => globalThis.setTimeout(res, time*10)) + console.log(time) + } + + await Promise.all([delay(2), delay(1)]) + `) + const logs = i.logs.logs.map(l => l.args[0]) + assert_equal(logs, [1, 2]) + }), + ]