From dd5b587bd3808b988de6eb82cee3d7e0c5d43540 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 26 Feb 2026 14:53:21 -0500 Subject: [PATCH] chore: simplify batch.flush (#17814) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit another extraction from #17805. I always felt bad about `this.process([])`, and this PR replaces it with the steps that actually occur — even though this is arguably duplicative, I find it much easier to understand. It also allows us to avoid activating batches with no queued effects, thanks to the change in #17809. This saves us a bit of work in a not-that-uncommon case. ### Before submitting the PR, please make sure you do the following - [x] It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs - [x] Prefix your PR title with `feat:`, `fix:`, `chore:`, or `docs:`. - [x] This message body should clearly illustrate what problems it solves. - [ ] Ideally, include a test that fails without this PR but passes with it. - [ ] If this PR changes code within `packages/svelte/src`, add a changeset (`npx changeset`). ### Tests and linting - [x] Run the tests with `pnpm test` and lint the project with `pnpm lint` --- .../src/internal/client/reactivity/batch.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 5f93cc68e0..eede5097f7 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -339,17 +339,16 @@ export class Batch { } flush() { - this.activate(); - if (queued_root_effects.length > 0) { + this.activate(); flush_effects(); + } else if (this.#pending === 0 && !this.is_fork) { + // append/remove branches + for (const fn of this.#commit_callbacks) fn(this); + this.#commit_callbacks.clear(); - if (current_batch !== null && current_batch !== this) { - // this can happen if a new batch was created during `flush_effects()` - return; - } - } else if (this.#pending === 0) { - this.process([]); // TODO this feels awkward + this.#commit(); + this.#deferred?.resolve(); } this.deactivate();