mirror of
https://github.com/leporello-js/leporello-js
synced 2026-01-13 21:14:28 -08:00
wrap promises from external calls
This commit is contained in:
35
src/eval.js
35
src/eval.js
@@ -372,6 +372,24 @@ export const eval_modules = (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const set_promise_status = value => {
|
||||||
|
if(value instanceof Promise.Original) {
|
||||||
|
// record stack for async calls, so expand calls works sync
|
||||||
|
set_record_call()
|
||||||
|
return value
|
||||||
|
.then(v => {
|
||||||
|
value.status = {ok: true, value: v}
|
||||||
|
return v
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
value.status = {ok: false, error: e}
|
||||||
|
throw e
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const __with_restore_children = async value => {
|
const __with_restore_children = async value => {
|
||||||
// children is an array of child calls for current function call. But it
|
// children is an array of child calls for current function call. But it
|
||||||
// can be null to save one empty array allocation in case it has no child
|
// can be null to save one empty array allocation in case it has no child
|
||||||
@@ -421,20 +439,7 @@ export const eval_modules = (
|
|||||||
try {
|
try {
|
||||||
value = fn(...args)
|
value = fn(...args)
|
||||||
ok = true
|
ok = true
|
||||||
if(value instanceof Promise.Original) {
|
return set_promise_status(value)
|
||||||
set_record_call()
|
|
||||||
return value
|
|
||||||
.then(v => {
|
|
||||||
value.status = {ok: true, value: v}
|
|
||||||
return v
|
|
||||||
})
|
|
||||||
.catch(e => {
|
|
||||||
value.status = {ok: false, error: e}
|
|
||||||
throw e
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
} catch(_error) {
|
} catch(_error) {
|
||||||
ok = false
|
ok = false
|
||||||
error = _error
|
error = _error
|
||||||
@@ -534,7 +539,7 @@ export const eval_modules = (
|
|||||||
value = undefined
|
value = undefined
|
||||||
}
|
}
|
||||||
ok = true
|
ok = true
|
||||||
return value
|
return set_promise_status(value)
|
||||||
} catch(_error) {
|
} catch(_error) {
|
||||||
ok = false
|
ok = false
|
||||||
error = _error
|
error = _error
|
||||||
|
|||||||
22
test/test.js
22
test/test.js
@@ -2767,7 +2767,29 @@ const y = x()`
|
|||||||
assert_equal(logs, [1, 2])
|
assert_equal(logs, [1, 2])
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
test('async/await external async fn', async () => {
|
||||||
|
await assert_code_evals_to_async(
|
||||||
|
`
|
||||||
|
const AsyncFunction =
|
||||||
|
new Function('return (async () => {}).constructor')()
|
||||||
|
const async_fn = new AsyncFunction('return 1')
|
||||||
|
await async_fn()
|
||||||
|
`,
|
||||||
|
1
|
||||||
|
)
|
||||||
|
}),
|
||||||
|
|
||||||
|
// TODO
|
||||||
/*
|
/*
|
||||||
|
test('async/await Promise.then creates subcall', async () => {
|
||||||
|
const i = await test_initial_state_async(`
|
||||||
|
await Promise.resolve(1).then(x => {
|
||||||
|
})
|
||||||
|
`)
|
||||||
|
console.log('i', root_calltree_node(i))
|
||||||
|
|
||||||
|
}),
|
||||||
|
|
||||||
test('async/await bug', async () => {
|
test('async/await bug', async () => {
|
||||||
const code = `
|
const code = `
|
||||||
const f = async () => {
|
const f = async () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user