pull/16197/head
Rich Harris 7 months ago
parent a5275b2405
commit 4e417e1ee2

@ -1,8 +1,6 @@
/** @import { Effect, Source } from '#client' */
import { noop } from '../../shared/utils.js';
import { DIRTY } from '../constants.js';
import { flushSync } from '../runtime.js';
import { internal_set, mark_reactions } from './sources.js';
/** @type {Set<Fork>} */
const forks = new Set();

@ -14,7 +14,8 @@ import {
derived_sources,
set_derived_sources,
check_dirtiness,
untracking
untracking,
queue_flush
} from '../runtime.js';
import { equals, safe_equals } from './equality.js';
import {
@ -221,6 +222,8 @@ export function internal_set(source, value) {
inspect_effects.clear();
}
queue_flush();
}
return value;

@ -742,6 +742,24 @@ function flush_queued_effects(effects) {
* @returns {void}
*/
export function schedule_effect(signal) {
queue_flush();
var effect = (last_scheduled_effect = signal);
while (effect.parent !== null) {
effect = effect.parent;
var flags = effect.f;
if ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) {
if ((flags & CLEAN) === 0) return;
effect.f ^= CLEAN;
}
}
queued_root_effects.push(effect);
}
export function queue_flush() {
if (!is_flushing) {
is_flushing = true;
queueMicrotask(() => {
@ -757,20 +775,6 @@ export function schedule_effect(signal) {
remove_active_fork();
});
}
var effect = (last_scheduled_effect = signal);
while (effect.parent !== null) {
effect = effect.parent;
var flags = effect.f;
if ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) {
if ((flags & CLEAN) === 0) return;
effect.f ^= CLEAN;
}
}
queued_root_effects.push(effect);
}
/**

@ -13,10 +13,14 @@ export default test({
flushSync();
assert.htmlEqual(
target.innerHTML,
'<button>step 1</button><button>step 2</button><button>step 3</button><p>oops!</p><button>reset</button>'
'<button>step 1</button><button>step 2</button><button>step 3</button><p>oops!</p><button data-id="reset">reset</button>'
);
flushSync(() => button2.click());
const reset = /** @type {HTMLButtonElement} */ (target.querySelector('[data-id="reset"]'));
flushSync(() => reset.click());
assert.htmlEqual(
target.innerHTML,
'<button>step 1</button><button>step 2</button><button>step 3</button><p>pending</p>'

@ -15,6 +15,6 @@
{#snippet failed(error, reset)}
<p>{error.message}</p>
<button onclick={reset}>reset</button>
<button data-id="reset" onclick={reset}>reset</button>
{/snippet}
</svelte:boundary>

Loading…
Cancel
Save