pull/15348/head
Rich Harris 7 months ago
parent 7d6d94c594
commit 02a7cf887f

@ -9,7 +9,6 @@ import {
} from './reactivity/effects.js'; } from './reactivity/effects.js';
import { import {
EFFECT, EFFECT,
RENDER_EFFECT,
DIRTY, DIRTY,
MAYBE_DIRTY, MAYBE_DIRTY,
CLEAN, CLEAN,
@ -41,15 +40,11 @@ import {
} from './context.js'; } from './context.js';
import { is_firefox } from './dom/operations.js'; import { is_firefox } from './dom/operations.js';
const FLUSH_MICROTASK = 0;
const FLUSH_SYNC = 1;
// Used for DEV time error handling // Used for DEV time error handling
/** @param {WeakSet<Error>} value */ /** @param {WeakSet<Error>} value */
const handled_errors = new WeakSet(); const handled_errors = new WeakSet();
export let is_throwing_error = false; export let is_throwing_error = false;
// Used for controlling the flush of effects.
let scheduler_mode = FLUSH_MICROTASK;
// Used for handling scheduling // Used for handling scheduling
let is_micro_task_queued = false; let is_micro_task_queued = false;
@ -672,6 +667,8 @@ function flush_queued_root_effects(root_effects) {
var previously_flushing_effect = is_flushing_effect; var previously_flushing_effect = is_flushing_effect;
is_flushing_effect = true; is_flushing_effect = true;
is_flushing = true;
try { try {
for (var i = 0; i < length; i++) { for (var i = 0; i < length; i++) {
var effect = root_effects[i]; var effect = root_effects[i];
@ -683,8 +680,13 @@ function flush_queued_root_effects(root_effects) {
var collected_effects = process_effects(effect); var collected_effects = process_effects(effect);
flush_queued_effects(collected_effects); flush_queued_effects(collected_effects);
} }
if (queued_root_effects.length > 0) {
flush_queued_root_effects(queued_root_effects);
}
} finally { } finally {
is_flushing_effect = previously_flushing_effect; is_flushing_effect = previously_flushing_effect;
is_flushing = false;
} }
} }
@ -740,17 +742,17 @@ function process_deferred() {
} }
} }
let is_flushing = false;
/** /**
* @param {Effect} signal * @param {Effect} signal
* @returns {void} * @returns {void}
*/ */
export function schedule_effect(signal) { export function schedule_effect(signal) {
if (scheduler_mode === FLUSH_MICROTASK) { if (!is_micro_task_queued && !is_flushing) {
if (!is_micro_task_queued) {
is_micro_task_queued = true; is_micro_task_queued = true;
queueMicrotask(process_deferred); queueMicrotask(process_deferred);
} }
}
last_scheduled_effect = signal; last_scheduled_effect = signal;
@ -850,12 +852,8 @@ function process_effects(effect) {
* @returns {any} * @returns {any}
*/ */
export function flush_sync(fn) { export function flush_sync(fn) {
var previous_scheduler_mode = scheduler_mode;
try {
infinite_loop_guard(); infinite_loop_guard();
scheduler_mode = FLUSH_SYNC;
is_micro_task_queued = false; is_micro_task_queued = false;
flush_queued_root_effects(queued_root_effects); flush_queued_root_effects(queued_root_effects);
@ -874,9 +872,6 @@ export function flush_sync(fn) {
} }
return result; return result;
} finally {
scheduler_mode = previous_scheduler_mode;
}
} }
/** /**

@ -47,6 +47,8 @@ export default test({
{ id: 1, name: 'a' } { id: 1, name: 'a' }
]; ];
raf.tick(0);
divs = target.querySelectorAll('div'); divs = target.querySelectorAll('div');
assert.ok(divs[0].getAnimations().length > 0); assert.ok(divs[0].getAnimations().length > 0);
assert.equal(divs[1].getAnimations().length, 0); assert.equal(divs[1].getAnimations().length, 0);

@ -46,6 +46,8 @@ export default test({
{ id: 1, name: 'a' } { id: 1, name: 'a' }
]; ];
raf.tick(0);
divs = document.querySelectorAll('div'); divs = document.querySelectorAll('div');
assert.equal(divs[0].dy, 120); assert.equal(divs[0].dy, 120);
assert.equal(divs[4].dy, -120); assert.equal(divs[4].dy, -120);

@ -1,4 +1,5 @@
// @ts-nocheck // @ts-nocheck
import { flushSync } from 'svelte';
import { test } from '../../test'; import { test } from '../../test';
export default test({ export default test({
@ -46,6 +47,8 @@ export default test({
{ id: 1, name: 'a' } { id: 1, name: 'a' }
]; ];
raf.tick(0);
divs = document.querySelectorAll('div'); divs = document.querySelectorAll('div');
assert.equal(divs[0].dy, 120); assert.equal(divs[0].dy, 120);
assert.equal(divs[4].dy, -120); assert.equal(divs[4].dy, -120);
@ -66,6 +69,8 @@ export default test({
{ id: 5, name: 'e' } { id: 5, name: 'e' }
]; ];
raf.tick(100);
divs = document.querySelectorAll('div'); divs = document.querySelectorAll('div');
assert.equal(divs[0].dy, 120); assert.equal(divs[0].dy, 120);

@ -50,6 +50,8 @@ export default test({
{ id: 1, name: 'a' } { id: 1, name: 'a' }
]; ];
raf.tick(0);
divs = target.querySelectorAll('div'); divs = target.querySelectorAll('div');
assert.equal(divs[0].style.transform, 'translate(0px, 120px)'); assert.equal(divs[0].style.transform, 'translate(0px, 120px)');
assert.equal(divs[1].style.transform, ''); assert.equal(divs[1].style.transform, '');

Loading…
Cancel
Save