Skip to content

Commit 5d6b081

Browse files
committed
run rescheduled block effects eagerly
1 parent 8e2cc02 commit 5d6b081

File tree

3 files changed

+6
-20
lines changed

3 files changed

+6
-20
lines changed

packages/svelte/src/internal/client/dom/operations.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { get_descriptor, is_extensible } from '../../shared/utils.js';
66
import { active_effect } from '../runtime.js';
77
import { async_mode_flag } from '../../flags/index.js';
88
import { TEXT_NODE, EFFECT_RAN } from '#client/constants';
9+
import { eager_block_effects } from '../reactivity/batch.js';
910

1011
// export these for reference in the compiled code, making global name deduplication unnecessary
1112
/** @type {Window} */
@@ -214,6 +215,7 @@ export function clear_text_content(node) {
214215
*/
215216
export function should_defer_append() {
216217
if (!async_mode_flag) return false;
218+
if (eager_block_effects !== null) return false;
217219

218220
var flags = /** @type {Effect} */ (active_effect).f;
219221
return (flags & EFFECT_RAN) !== 0;

packages/svelte/src/internal/client/reactivity/batch.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import * as e from '../errors.js';
2828
import { flush_tasks } from '../dom/task.js';
2929
import { DEV } from 'esm-env';
3030
import { invoke_error_boundary } from '../error-handling.js';
31-
import { old_values, schedule_version } from './sources.js';
31+
import { old_values } from './sources.js';
3232
import { unlink_effect } from './effects.js';
3333
import { unset_context } from './async.js';
3434

@@ -601,8 +601,6 @@ function flush_queued_effects(effects) {
601601
var effect = effects[i++];
602602

603603
if ((effect.f & (DESTROYED | INERT)) === 0 && is_dirty(effect)) {
604-
var sv = schedule_version;
605-
606604
eager_block_effects = [];
607605

608606
update_effect(effect);
@@ -625,26 +623,19 @@ function flush_queued_effects(effects) {
625623
}
626624

627625
if (eager_block_effects.length > 0) {
626+
// TODO this feels incorrect! it gets the tests passing
627+
old_values.clear();
628+
628629
for (const e of eager_block_effects) {
629630
update_effect(e);
630631
}
631632

632633
eager_block_effects = [];
633634
}
634-
635-
// if a state change in a user effect invalidates a _different_ effect,
636-
// abort and reschedule in case that effect now needs to be destroyed
637-
if (schedule_version > sv && (effect.f & USER_EFFECT) !== 0) {
638-
// break;
639-
}
640635
}
641636
}
642637

643638
eager_block_effects = null;
644-
645-
while (i < length) {
646-
schedule_effect(effects[i++]);
647-
}
648639
}
649640

650641
/**

packages/svelte/src/internal/client/reactivity/sources.js

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -299,12 +299,6 @@ export function increment(source) {
299299
set(source, source.v + 1);
300300
}
301301

302-
/**
303-
* We increment this value when a block effect is scheduled as a result of a state change,
304-
* as its currently-scheduled child effects may need to be destroyed
305-
*/
306-
export let schedule_version = 0;
307-
308302
/**
309303
* @param {Value} signal
310304
* @param {number} status should be DIRTY or MAYBE_DIRTY
@@ -344,7 +338,6 @@ function mark_reactions(signal, status) {
344338
if (eager_block_effects !== null) {
345339
eager_block_effects.push(/** @type {Effect} */ (reaction));
346340
}
347-
schedule_version += 1;
348341
}
349342

350343
schedule_effect(/** @type {Effect} */ (reaction));

0 commit comments

Comments
 (0)