guarantee fork

pull/16197/head
Rich Harris 6 months ago
parent e247f665af
commit d42b358f99

@ -1,5 +1,5 @@
/** @import { Effect, TemplateNode, Value } from '#client' */ /** @import { Effect, TemplateNode, Value } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js' */
import { async_derived } from '../../reactivity/deriveds.js'; import { async_derived } from '../../reactivity/deriveds.js';
import { active_fork } from '../../reactivity/forks.js'; import { active_fork } from '../../reactivity/forks.js';
import { active_effect, schedule_effect } from '../../runtime.js'; import { active_effect, schedule_effect } from '../../runtime.js';
@ -13,15 +13,16 @@ import { capture } from './boundary.js';
export function async(node, expressions, fn) { export function async(node, expressions, fn) {
// TODO handle hydration // TODO handle hydration
var fork = active_fork; var fork = /** @type {Fork} */ (active_fork);
var effect = /** @type {Effect} */ (active_effect); var effect = /** @type {Effect} */ (active_effect);
var restore = capture(); var restore = capture();
Promise.all(expressions.map((fn) => async_derived(fn))).then((result) => { Promise.all(expressions.map((fn) => async_derived(fn))).then((result) => {
restore(); restore();
fn(node, ...result); fn(node, ...result);
fork?.run(() => { fork.run(() => {
schedule_effect(effect); schedule_effect(effect);
}); });
}); });

@ -24,7 +24,7 @@ import { queue_boundary_micro_task } from '../task.js';
import * as e from '../../../shared/errors.js'; import * as e from '../../../shared/errors.js';
import { DEV } from 'esm-env'; import { DEV } from 'esm-env';
import { from_async_derived, set_from_async_derived } from '../../reactivity/deriveds.js'; import { from_async_derived, set_from_async_derived } from '../../reactivity/deriveds.js';
import { active_fork, Fork } from '../../reactivity/forks.js'; import { Fork } from '../../reactivity/forks.js';
/** /**
* @typedef {{ * @typedef {{

@ -1,4 +1,5 @@
/** @import { EachItem, EachState, Effect, MaybeSource, Source, TemplateNode, TransitionManager, Value } from '#client' */ /** @import { EachItem, EachState, Effect, MaybeSource, Source, TemplateNode, TransitionManager, Value } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js'; */
import { import {
EACH_INDEX_REACTIVE, EACH_INDEX_REACTIVE,
EACH_IS_ANIMATED, EACH_IS_ANIMATED,
@ -266,8 +267,9 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f
fallback = branch(() => fallback_fn(anchor)); fallback = branch(() => fallback_fn(anchor));
} }
} else { } else {
if (active_fork !== null && should_defer_append()) { if (should_defer_append()) {
var keys = new Set(); var keys = new Set();
var fork = /** @type {Fork} */ (active_fork);
for (i = 0; i < length; i += 1) { for (i = 0; i < length; i += 1) {
value = array[i]; value = array[i];
@ -303,11 +305,11 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f
for (const [key, item] of state.items) { for (const [key, item] of state.items) {
if (!keys.has(key)) { if (!keys.has(key)) {
active_fork.skipped_effects.add(item.e); fork.skipped_effects.add(item.e);
} }
} }
active_fork?.add_callback(commit); fork.add_callback(commit);
} else { } else {
commit(); commit();
} }

@ -1,4 +1,5 @@
/** @import { Effect, TemplateNode } from '#client' */ /** @import { Effect, TemplateNode } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js'; */
import { EFFECT_TRANSPARENT } from '#client/constants'; import { EFFECT_TRANSPARENT } from '#client/constants';
import { import {
hydrate_next, hydrate_next,
@ -112,7 +113,7 @@ export function if_block(node, fn, elseif = false) {
} }
} }
var defer = active_fork !== null && should_defer_append(); var defer = should_defer_append();
var target = anchor; var target = anchor;
if (defer) { if (defer) {
@ -125,13 +126,15 @@ export function if_block(node, fn, elseif = false) {
} }
if (defer) { if (defer) {
var fork = /** @type {Fork} */ (active_fork);
const skipped = condition ? alternate_effect : consequent_effect; const skipped = condition ? alternate_effect : consequent_effect;
if (skipped !== null) { if (skipped !== null) {
// TODO need to do this for other kinds of blocks // TODO need to do this for other kinds of blocks
active_fork?.skipped_effects.add(skipped); fork.skipped_effects.add(skipped);
} }
active_fork?.add_callback(commit); fork.add_callback(commit);
} else { } else {
commit(); commit();
} }

@ -1,4 +1,5 @@
/** @import { Effect, TemplateNode } from '#client' */ /** @import { Effect, TemplateNode } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js'; */
import { UNINITIALIZED } from '../../../../constants.js'; import { UNINITIALIZED } from '../../../../constants.js';
import { block, branch, pause_effect } from '../../reactivity/effects.js'; import { block, branch, pause_effect } from '../../reactivity/effects.js';
import { not_equal, safe_not_equal } from '../../reactivity/equality.js'; import { not_equal, safe_not_equal } from '../../reactivity/equality.js';
@ -55,7 +56,7 @@ export function key_block(node, get_key, render_fn) {
if (changed(key, (key = get_key()))) { if (changed(key, (key = get_key()))) {
var target = anchor; var target = anchor;
var defer = active_fork !== null && should_defer_append(); var defer = should_defer_append();
if (defer) { if (defer) {
offscreen_fragment = document.createDocumentFragment(); offscreen_fragment = document.createDocumentFragment();
@ -65,7 +66,7 @@ export function key_block(node, get_key, render_fn) {
pending_effect = branch(() => render_fn(target)); pending_effect = branch(() => render_fn(target));
if (defer) { if (defer) {
active_fork?.add_callback(commit); /** @type {Fork} */ (active_fork).add_callback(commit);
} else { } else {
commit(); commit();
} }

@ -1,4 +1,5 @@
/** @import { TemplateNode, Dom, Effect } from '#client' */ /** @import { TemplateNode, Dom, Effect } from '#client' */
/** @import { Fork } from '../../reactivity/forks.js'; */
import { EFFECT_TRANSPARENT } from '#client/constants'; import { EFFECT_TRANSPARENT } from '#client/constants';
import { block, branch, pause_effect } from '../../reactivity/effects.js'; import { block, branch, pause_effect } from '../../reactivity/effects.js';
import { active_fork } from '../../reactivity/forks.js'; import { active_fork } from '../../reactivity/forks.js';
@ -53,7 +54,7 @@ export function component(node, get_component, render_fn) {
block(() => { block(() => {
if (component === (component = get_component())) return; if (component === (component = get_component())) return;
var defer = active_fork !== null && should_defer_append(); var defer = should_defer_append();
if (component) { if (component) {
var target = anchor; var target = anchor;
@ -67,7 +68,7 @@ export function component(node, get_component, render_fn) {
} }
if (defer) { if (defer) {
active_fork?.add_callback(commit); /** @type {Fork} */ (active_fork).add_callback(commit);
} else { } else {
commit(); commit();
} }

@ -343,7 +343,7 @@ export function template_effect(fn, sync = [], async = [], d = derived) {
var parent = /** @type {Effect} */ (active_effect); var parent = /** @type {Effect} */ (active_effect);
if (async.length > 0) { if (async.length > 0) {
var fork = active_fork; var fork = /** @type {Fork} */ (active_fork);
var restore = capture(); var restore = capture();
Promise.all(async.map((expression) => async_derived(expression))).then((result) => { Promise.all(async.map((expression) => async_derived(expression))).then((result) => {
@ -355,11 +355,9 @@ export function template_effect(fn, sync = [], async = [], d = derived) {
var effect = create_template_effect(fn, [...sync.map(d), ...result]); var effect = create_template_effect(fn, [...sync.map(d), ...result]);
if (fork !== null) { fork.run(() => {
fork.run(() => { schedule_effect(effect);
schedule_effect(effect); });
});
}
}); });
} else { } else {
create_template_effect(fn, sync.map(d)); create_template_effect(fn, sync.map(d));

Loading…
Cancel
Save