out-of-order-rendering
Rich Harris 3 days ago
parent 2cf77396b9
commit eda1dd9bec

@ -37,9 +37,7 @@ export function EachBlock(node, context) {
if (node.body) if (node.body)
each.push( each.push(
// TODO get rid of fragment.has_await // TODO get rid of fragment.has_await
...(node.body.metadata.has_await ...(node.body.metadata.has_await ? [create_async_block(b.block(new_body))] : new_body)
? [create_async_block(b.block(new_body), b.array([]), node.body.metadata.has_await)]
: new_body)
); );
const for_loop = b.for( const for_loop = b.for(
@ -71,8 +69,13 @@ export function EachBlock(node, context) {
block.body.push(for_loop); block.body.push(for_loop);
} }
if (node.metadata.expression.has_await) { const blockers = node.metadata.expression.blockers();
state.template.push(create_async_block(block), block_close);
if (node.metadata.expression.has_await || blockers.elements.length > 0) {
state.template.push(
create_async_block(block, blockers, node.metadata.expression.has_await),
block_close
);
} else { } else {
state.template.push(...block.body, block_close); state.template.push(...block.body, block_close);
} }

@ -278,7 +278,7 @@ export function create_child_block(body, async) {
* @param {ArrayExpression} blockers * @param {ArrayExpression} blockers
* @param {boolean} has_await * @param {boolean} has_await
*/ */
export function create_async_block(body, blockers, has_await) { export function create_async_block(body, blockers = b.array([]), has_await = true) {
return b.stmt( return b.stmt(
b.call('$$renderer.async', blockers, b.arrow([b.id('$$renderer')], body, has_await)) b.call('$$renderer.async', blockers, b.arrow([b.id('$$renderer')], body, has_await))
); );

Loading…
Cancel
Save