This commit is contained in:
Dmitry Vasilev
2022-12-16 13:15:27 +08:00
parent 2cbb546b8c
commit 416fdcf20b
2 changed files with 50 additions and 37 deletions

View File

@@ -7,42 +7,32 @@ export const patch_promise = window => {
class PromiseWithStatus extends Promise { class PromiseWithStatus extends Promise {
constructor(fn) { constructor(fn) {
let status const p = new Promise.Original((resolve, reject) => {
let is_constructor_finished = false
super(
(resolve, reject) => {
fn( fn(
(value) => { (value) => {
if(value instanceof window.Promise.Original) { if(value instanceof window.Promise) {
value value
.then(v => { .then(v => {
this.status = {ok: true, value: v} p.status = {ok: true, value: v}
resolve(v) resolve(v)
}) })
.catch(e => { .catch(e => {
this.status = {ok: false, error: e} p.status = {ok: false, error: e}
reject(e) reject(e)
}) })
} else { } else {
status = {ok: true, value} p.status = {ok: true, value}
if(is_constructor_finished) {
this.status = status
}
resolve(value) resolve(value)
} }
}, },
(error) => { (error) => {
status = {ok: false, error} p.status = {ok: false, error}
if(is_constructor_finished) {
this.status = status
}
reject(error) reject(error)
}, },
) )
} })
)
is_constructor_finished = true return p
this.status = status
} }
} }

View File

@@ -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 () => { test('async/await return from async function', async () => {
await assert_code_evals_to_async( await assert_code_evals_to_async(
` `
@@ -2746,6 +2755,20 @@ const y = x()`
assert_equal(logs, [1, 2]) 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 () => { test('async/await logs out of order', async () => {
const i = await test_initial_state_async(` const i = await test_initial_state_async(`
// Init promises p1 and p2 that are resolved in different order (p2 then // Init promises p1 and p2 that are resolved in different order (p2 then