Fixes destructuring signal with await bug

pull/9962/head
Nguyen Tran 3 years ago
parent eab690d31a
commit f1fad55c4d

@ -142,15 +142,16 @@ export function serialize_set_binding(node, context, fallback) {
}
return b.call(
b.thunk(
b.arrow(
[b.id(tmp_id)],
b.block([
b.const(tmp_id, /** @type {import('estree').Expression} */ (visit(node.right))),
b.stmt(b.sequence(assignments)),
// return because it could be used in a nested expression where the value is needed.
// example: { foo: ({ bar } = { bar: 1 })}
b.return(b.id(tmp_id))
])
)
),
/** @type {import('estree').Expression} */ (visit(node.right)),
);
}

@ -0,0 +1,28 @@
import { test } from '../../test';
import { setTimeout } from 'node:timers/promises';
export default test({
html: `
<p>Name: tom</p>
<p>Email: tom@mail.com</p>
<p>Number: 555</p>
<button>Update me</button>
`,
async test({ assert, target }) {
const [button] = target.querySelectorAll('button');
const event = new window.MouseEvent('click', { bubbles: true });
await button.dispatchEvent(event);
await setTimeout(100);
assert.htmlEqual(
target.innerHTML,
`
<p>Name: jerry</p>
<p>Email: jerry@mail.com</p>
<p>Number: 777</p>
<button>Update me</button>
`
);
}
});

@ -0,0 +1,22 @@
<script>
let name = $state("tom");
let email = $state("tom@mail.com");
let number = $state(555);
export const fetch_user = () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve([{name: "jerry", email: "jerry@mail.com"}, 777])
}, 100)
})
}
const update = async () => {
[{ name, email }, number] = await fetch_user();
}
</script>
<p>Name: {name}</p>
<p>Email: {email}</p>
<p>Number: {number}</p>
<button on:click={update}>Update me</button>
Loading…
Cancel
Save