rename suspend/exit to save/restore

aaa
Rich Harris 8 months ago
parent c0f26a1c22
commit 0743a013be

@ -14,7 +14,7 @@ export function AwaitExpression(node, context) {
if (context.state.expression) { if (context.state.expression) {
suspend = true; suspend = true;
// wrap the expression in `(await $.suspend(...)).exit()` if necessary, // wrap the expression in `(await $.save(...)).restore()` if necessary,
// i.e. whether anything could potentially be read _after_ the await // i.e. whether anything could potentially be read _after_ the await
let i = context.path.length; let i = context.path.length;
while (i--) { while (i--) {

@ -16,12 +16,9 @@ export function AwaitExpression(node, context) {
return b.call( return b.call(
b.member( b.member(
b.await( b.await(
b.call( b.call('$.save', node.argument && /** @type {Expression} */ (context.visit(node.argument)))
'$.suspend',
node.argument && /** @type {Expression} */ (context.visit(node.argument))
)
), ),
'exit' 'restore'
) )
); );
} }

@ -171,14 +171,14 @@ export function VariableDeclaration(node, context) {
b.member( b.member(
b.await( b.await(
b.call( b.call(
'$.suspend', '$.save',
b.call( b.call(
'$.async_derived', '$.async_derived',
rune === '$derived.by' ? value : b.thunk(value, true) rune === '$derived.by' ? value : b.thunk(value, true)
) )
) )
), ),
'exit' 'restore'
) )
) )
) )

@ -1,7 +1,7 @@
/** @import { TemplateNode, Value } from '#client' */ /** @import { TemplateNode, Value } from '#client' */
import { async_derived } from '../../reactivity/deriveds.js'; import { async_derived } from '../../reactivity/deriveds.js';
import { suspend } from './boundary.js'; import { save } from './boundary.js';
/** /**
* @param {TemplateNode} node * @param {TemplateNode} node
@ -11,7 +11,7 @@ import { suspend } from './boundary.js';
export function async(node, expressions, fn) { export function async(node, expressions, fn) {
// TODO handle hydration // TODO handle hydration
suspend(Promise.all(expressions.map(async_derived))).then((result) => { save(Promise.all(expressions.map(async_derived))).then((result) => {
fn(node, ...result.exit()); fn(node, ...result.restore());
}); });
} }

@ -253,15 +253,28 @@ export function boundary(node, props, boundary_fn) {
// TODO separate this stuff out — suspending and context preservation should // TODO separate this stuff out — suspending and context preservation should
// be distinct concepts // be distinct concepts
function capture() {
var previous_effect = active_effect;
var previous_reaction = active_reaction;
var previous_component_context = component_context;
return function restore() {
set_active_effect(previous_effect);
set_active_reaction(previous_reaction);
set_component_context(previous_component_context);
// prevent the active effect from outstaying its welcome
queue_post_micro_task(exit);
};
}
/** /**
* @template T * @template T
* @param {Promise<T>} promise * @param {Promise<T>} promise
* @returns {Promise<{ exit: () => T }>} * @returns {Promise<{ restore: () => T }>}
*/ */
export async function suspend(promise) { export async function save(promise) {
var previous_effect = active_effect; var restore = capture();
var previous_reaction = active_reaction;
var previous_component_context = component_context;
let boundary = active_effect; let boundary = active_effect;
while (boundary !== null) { while (boundary !== null) {
@ -282,13 +295,8 @@ export async function suspend(promise) {
const value = await promise; const value = await promise;
return { return {
exit() { restore() {
set_active_effect(previous_effect); restore();
set_active_reaction(previous_reaction);
set_component_context(previous_component_context);
// prevent the active effect from outstaying its welcome
queue_post_micro_task(exit);
// @ts-ignore // @ts-ignore
boundary?.fn(ASYNC_DECREMENT); boundary?.fn(ASYNC_DECREMENT);

@ -130,7 +130,7 @@ export {
update_store, update_store,
mark_store_binding mark_store_binding
} from './reactivity/store.js'; } from './reactivity/store.js';
export { boundary, exit, suspend } from './dom/blocks/boundary.js'; export { boundary, exit, save } from './dom/blocks/boundary.js';
export { set_text } from './render.js'; export { set_text } from './render.js';
export { export {
get, get,

@ -27,7 +27,7 @@ import { block, destroy_effect } from './effects.js';
import { inspect_effects, internal_set, set_inspect_effects, source } from './sources.js'; import { inspect_effects, internal_set, set_inspect_effects, source } from './sources.js';
import { get_stack } from '../dev/tracing.js'; import { get_stack } from '../dev/tracing.js';
import { tracing_mode_flag } from '../../flags/index.js'; import { tracing_mode_flag } from '../../flags/index.js';
import { exit, suspend } from '../dom/blocks/boundary.js'; import { exit, save } from '../dom/blocks/boundary.js';
/** /**
* @template V * @template V
@ -95,7 +95,7 @@ export function async_derived(fn) {
block(() => { block(() => {
var current = (promise = fn()); var current = (promise = fn());
var derived_promise = suspend(promise); var derived_promise = save(promise);
derived_promise.then((v) => { derived_promise.then((v) => {
if ((effect.f & DESTROYED) !== 0) { if ((effect.f & DESTROYED) !== 0) {
@ -103,14 +103,14 @@ export function async_derived(fn) {
} }
if (promise === current) { if (promise === current) {
internal_set(value, v.exit()); internal_set(value, v.restore());
// TODO at the very least the naming is weird here // TODO at the very least the naming is weird here
exit(); exit();
} }
}); });
derived_promise.catch(e => { derived_promise.catch((e) => {
handle_error(e, effect, null, effect.ctx); handle_error(e, effect, null, effect.ctx);
}); });
}, EFFECT_HAS_DERIVED); }, EFFECT_HAS_DERIVED);

@ -45,7 +45,7 @@ import { DEV } from 'esm-env';
import { define_property } from '../../shared/utils.js'; import { define_property } from '../../shared/utils.js';
import { get_next_sibling } from '../dom/operations.js'; import { get_next_sibling } from '../dom/operations.js';
import { async_derived, derived, destroy_derived } from './deriveds.js'; import { async_derived, derived, destroy_derived } from './deriveds.js';
import { suspend } from '../dom/blocks/boundary.js'; import { save } from '../dom/blocks/boundary.js';
/** /**
* @param {'$effect' | '$effect.pre' | '$inspect'} rune * @param {'$effect' | '$effect.pre' | '$inspect'} rune
@ -353,12 +353,12 @@ export function template_effect(fn, sync = [], async = [], d = derived) {
let effect = /** @type {Effect} */ (active_effect); let effect = /** @type {Effect} */ (active_effect);
if (async.length > 0) { if (async.length > 0) {
suspend(Promise.all(async.map(async_derived))).then((result) => { save(Promise.all(async.map(async_derived))).then((result) => {
if ((effect.f & DESTROYED) !== 0) { if ((effect.f & DESTROYED) !== 0) {
return; return;
} }
create_template_effect(fn, [...sync.map(d), ...result.exit()]); create_template_effect(fn, [...sync.map(d), ...result.restore()]);
}); });
} else { } else {
create_template_effect(fn, sync.map(d)); create_template_effect(fn, sync.map(d));

Loading…
Cancel
Save