move signal init logic into create_effect

pull/10931/head
Rich Harris 2 years ago
parent ed2981d7b8
commit 5df01493a7

@ -7,8 +7,10 @@ import {
destroy_children,
execute_effect,
get,
is_flushing_effect,
remove_reactions,
schedule_effect,
set_is_flushing_effect,
set_signal_status,
untrack
} from '../runtime.js';
@ -20,7 +22,9 @@ import {
PRE_EFFECT,
DESTROYED,
INERT,
IS_ELSEIF
IS_ELSEIF,
CLEAN,
EFFECT_RAN
} from '../constants.js';
import { set } from './sources.js';
import { noop } from '../../common.js';
@ -63,7 +67,19 @@ function create_effect(type, fn, sync, init = true) {
}
if (init) {
schedule_effect(signal, sync);
if (sync) {
const previously_flushing_effect = is_flushing_effect;
try {
set_is_flushing_effect(true);
execute_effect(signal);
set_signal_status(signal, CLEAN);
signal.f |= EFFECT_RAN;
} finally {
set_is_flushing_effect(previously_flushing_effect);
}
} else {
schedule_effect(signal);
}
}
return signal;

@ -135,7 +135,7 @@ export function set(signal, value) {
) {
if (current_dependencies !== null && current_dependencies.includes(signal)) {
set_signal_status(current_effect, DIRTY);
schedule_effect(current_effect, false);
schedule_effect(current_effect);
} else {
if (current_untracked_writes === null) {
set_current_untracked_writes([signal]);

@ -36,7 +36,13 @@ const FLUSH_SYNC = 1;
let current_scheduler_mode = FLUSH_MICROTASK;
// Used for handling scheduling
let is_micro_task_queued = false;
let is_flushing_effect = false;
export let is_flushing_effect = false;
/** @param {boolean} value */
export function set_is_flushing_effect(value) {
is_flushing_effect = value;
}
// Used for $inspect
export let is_batching_effect = false;
let is_inspecting_signal = false;
@ -466,27 +472,18 @@ function process_microtask() {
/**
* @param {import('./types.js').Effect} signal
* @param {boolean} sync
* @returns {void}
*/
export function schedule_effect(signal, sync) {
export function schedule_effect(signal) {
const flags = signal.f;
if (sync) {
const previously_flushing_effect = is_flushing_effect;
try {
is_flushing_effect = true;
execute_effect(signal);
set_signal_status(signal, CLEAN);
} finally {
is_flushing_effect = previously_flushing_effect;
}
} else {
if (current_scheduler_mode === FLUSH_MICROTASK) {
if (!is_micro_task_queued) {
is_micro_task_queued = true;
queueMicrotask(process_microtask);
}
}
if ((flags & EFFECT) !== 0) {
current_queued_effects.push(signal);
// Prevent any nested user effects from potentially triggering
@ -542,9 +539,6 @@ export function schedule_effect(signal, sync) {
current_queued_pre_and_render_effects.push(signal);
}
}
}
signal.f |= EFFECT_RAN;
}
/**
@ -696,7 +690,7 @@ export function get(signal) {
current_untracked_writes.includes(signal)
) {
set_signal_status(current_effect, DIRTY);
schedule_effect(current_effect, false);
schedule_effect(current_effect);
}
}
@ -772,7 +766,7 @@ export function mark_subtree_inert(signal, inert) {
if (is_already_inert !== inert) {
signal.f ^= INERT;
if (!inert && (flags & CLEAN) === 0) {
schedule_effect(signal, false);
schedule_effect(signal);
}
}
@ -819,7 +813,7 @@ export function mark_reactions(signal, to_status, force_schedule) {
force_schedule
);
} else {
schedule_effect(/** @type {import('#client').Effect} */ (reaction), false);
schedule_effect(/** @type {import('#client').Effect} */ (reaction));
}
}
}
@ -1075,7 +1069,7 @@ export function pop(component) {
if (effects !== null) {
context_stack_item.e = null;
for (let i = 0; i < effects.length; i++) {
schedule_effect(effects[i], false);
schedule_effect(effects[i]);
}
}
current_component_context = context_stack_item.p;

Loading…
Cancel
Save