@@ -28,7 +28,7 @@ import {
2828 BOUNDARY_EFFECT ,
2929 YIELD_EFFECT
3030} from './constants.js' ;
31- import { flush_tasks , scheduler_yield } from './dom/task.js' ;
31+ import { flush_tasks , schedule_yield } from './dom/task.js' ;
3232import { add_owner } from './dev/ownership.js' ;
3333import { internal_set , set , source } from './reactivity/sources.js' ;
3434import { destroy_derived , execute_derived , update_derived } from './reactivity/deriveds.js' ;
@@ -40,7 +40,6 @@ import { tracing_expressions, get_stack } from './dev/tracing.js';
4040
4141const FLUSH_MICROTASK = 0 ;
4242const FLUSH_SYNC = 1 ;
43- const FLUSH_YIELD = 2 ;
4443// Used for DEV time error handling
4544/** @param {WeakSet<Error> } value */
4645const handled_errors = new WeakSet ( ) ;
@@ -51,8 +50,8 @@ let scheduler_mode = FLUSH_MICROTASK;
5150// Used for handling scheduling
5251let is_micro_task_queued = false ;
5352let is_yield_queued = false ;
54- /** @type {Array<() => void> } */
55- let queued_yield_tasks = [ ] ;
53+ /** @type {Effect[] } */
54+ let queued_yield_effects = [ ] ;
5655
5756/** @type {Effect | null } */
5857let last_scheduled_effect = null ;
@@ -665,7 +664,7 @@ function flush_queued_effects(effects) {
665664 }
666665}
667666
668- function flush_effects ( yielded_effects = false ) {
667+ function flush_deferred_effects ( yielded_effects = false ) {
669668 is_micro_task_queued = false ;
670669 if ( flush_count > 1001 ) {
671670 return ;
@@ -685,47 +684,24 @@ function flush_effects(yielded_effects = false) {
685684
686685function flush_yield_effects ( ) {
687686 is_yield_queued = false ;
688- var tasks = queued_yield_tasks . slice ( ) ;
689- queued_yield_tasks = [ ] ;
690- var previous_scheduler_mode = scheduler_mode ;
691- scheduler_mode = FLUSH_YIELD ;
692- try {
693- run_all ( tasks ) ;
694- } finally {
695- scheduler_mode = previous_scheduler_mode ;
696- }
697- flush_effects ( true ) ;
698- }
699687
700- /**
701- * @param { () => void } fn
702- */
703- export function queue_yield ( fn ) {
704- if ( ! is_yield_queued ) {
705- is_yield_queued = true ;
706- scheduler_yield ( flush_yield_effects ) ;
688+ for ( var i = 0 ; i < queued_yield_effects . length ; i ++ ) {
689+ var effect = queued_yield_effects [ i ] ;
690+ if ( ( effect . f & ( DESTROYED | INERT ) ) === 0 ) {
691+ last_scheduled_effect = effect ;
692+
693+ mark_parent_effects ( effect ) ;
694+ }
707695 }
708- queued_yield_tasks . push ( fn ) ;
696+ queued_yield_effects = [ ] ;
697+ flush_deferred_effects ( true ) ;
709698}
710699
711700/**
712701 * @param {Effect } signal
713702 * @returns {void }
714703 */
715- export function schedule_effect ( signal ) {
716- if ( scheduler_mode !== FLUSH_YIELD && ( signal . f & YIELD_EFFECT ) !== 0 ) {
717- queue_yield ( ( ) => {
718- schedule_effect ( signal ) ;
719- } ) ;
720- } else if ( scheduler_mode !== FLUSH_SYNC ) {
721- if ( ! is_micro_task_queued ) {
722- is_micro_task_queued = true ;
723- queueMicrotask ( flush_effects ) ;
724- }
725- }
726-
727- last_scheduled_effect = signal ;
728-
704+ function mark_parent_effects ( signal ) {
729705 var effect = signal ;
730706
731707 while ( effect . parent !== null ) {
@@ -741,6 +717,30 @@ export function schedule_effect(signal) {
741717 queued_root_effects . push ( effect ) ;
742718}
743719
720+ /**
721+ * @param {Effect } signal
722+ * @returns {void }
723+ */
724+ export function schedule_effect ( signal ) {
725+ if ( scheduler_mode !== FLUSH_SYNC ) {
726+ if ( ( signal . f & YIELD_EFFECT ) !== 0 ) {
727+ if ( ! is_yield_queued ) {
728+ is_yield_queued = true ;
729+ schedule_yield ( flush_yield_effects ) ;
730+ }
731+ queued_yield_effects . push ( signal ) ;
732+ return ;
733+ }
734+ if ( ! is_micro_task_queued ) {
735+ is_micro_task_queued = true ;
736+ queueMicrotask ( flush_deferred_effects ) ;
737+ }
738+ }
739+
740+ last_scheduled_effect = signal ;
741+ mark_parent_effects ( signal ) ;
742+ }
743+
744744/**
745745 *
746746 * This function both runs render effects and collects user effects in topological order
0 commit comments