Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/svelte/src/internal/client/dom/blocks/await.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import {
set_dev_current_component_function,
set_dev_stack
} from '../../context.js';
import { flushSync } from '../../reactivity/batch.js';
import { flushSync, is_flushing_sync } from '../../reactivity/batch.js';

const PENDING = 0;
const THEN = 1;
Expand Down Expand Up @@ -126,7 +126,7 @@ export function await_block(node, get_input, pending_fn, then_fn, catch_fn) {

// without this, the DOM does not update until two ticks after the promise
// resolves, which is unexpected behaviour (and somewhat irksome to test)
flushSync();
if (!is_flushing_sync) flushSync();
}
}
}
Expand Down
6 changes: 1 addition & 5 deletions packages/svelte/src/internal/client/dom/task.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@ function run_micro_tasks() {
run_all(tasks);
}

export function has_pending_tasks() {
return micro_tasks.length > 0;
}

/**
* @param {() => void} fn
*/
Expand All @@ -40,7 +36,7 @@ export function queue_micro_task(fn) {
* Synchronously run any queued tasks.
*/
export function flush_tasks() {
if (micro_tasks.length > 0) {
while (micro_tasks.length > 0) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

terrifying change 😆

run_micro_tasks();
}
}
23 changes: 12 additions & 11 deletions packages/svelte/src/internal/client/reactivity/batch.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import {
update_effect
} from '../runtime.js';
import * as e from '../errors.js';
import { flush_tasks, has_pending_tasks, queue_micro_task } from '../dom/task.js';
import { flush_tasks, queue_micro_task } from '../dom/task.js';
import { DEV } from 'esm-env';
import { invoke_error_boundary } from '../error-handling.js';
import { old_values } from './sources.js';
Expand Down Expand Up @@ -355,20 +355,18 @@ export class Batch {
}

flush() {
this.activate();

if (queued_root_effects.length > 0) {
this.activate();
flush_effects();

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.#commit();
}

if (current_batch !== null && current_batch !== this) {
// this can happen if a `flushSync` occurred during `flush_effects()`,
// which is permitted in legacy mode despite being a terrible idea
return;
}

this.deactivate();
}

Expand Down Expand Up @@ -468,14 +466,17 @@ export function flushSync(fn) {
var result;

if (fn) {
flush_effects();
if (current_batch !== null) {
flush_effects();
}

result = fn();
}

while (true) {
flush_tasks();

if (queued_root_effects.length === 0 && !has_pending_tasks()) {
if (queued_root_effects.length === 0) {
current_batch?.flush();

// we need to check again, in case we just updated an `$effect.pending()`
Expand Down
Loading