77 DIRTY ,
88 EFFECT_HAS_DERIVED ,
99 IS_ASYNC ,
10+ IS_DEFERRED ,
1011 MAYBE_DIRTY ,
1112 UNOWNED
1213} from '../constants.js' ;
@@ -24,7 +25,7 @@ import {
2425import { equals , safe_equals } from './equality.js' ;
2526import * as e from '../errors.js' ;
2627import { block , destroy_effect } from './effects.js' ;
27- import { inspect_effects , internal_set , set_inspect_effects , source } from './sources.js' ;
28+ import { inspect_effects , internal_set , mark_reactions , set_inspect_effects , source } from './sources.js' ;
2829import { get_stack } from '../dev/tracing.js' ;
2930import { tracing_mode_flag } from '../../flags/index.js' ;
3031import { capture , suspend } from '../dom/blocks/boundary.js' ;
@@ -76,10 +77,11 @@ export function derived(fn) {
7677/**
7778 * @template V
7879 * @param {() => Promise<V> } fn
80+ * @param {boolean } [deferred]
7981 * @returns {Promise<Source<V>> }
8082 */
8183/*#__NO_SIDE_EFFECTS__*/
82- export function async_derived ( fn ) {
84+ export function async_derived ( fn , deferred = false ) {
8385 let parent = /** @type {Effect | null } */ ( active_effect ) ;
8486
8587 if ( parent === null ) {
@@ -93,7 +95,12 @@ export function async_derived(fn) {
9395 var current = ( promise = fn ( ) ) ;
9496
9597 var restore = capture ( ) ;
96- var unsuspend = suspend ( ) ;
98+ var unsuspend = ! deferred ? suspend ( ) : undefined ;
99+
100+ if ( deferred && ( value . f & IS_DEFERRED ) === 0 ) {
101+ value . f ^= IS_DEFERRED ;
102+ mark_reactions ( value , DIRTY ) ;
103+ }
97104
98105 try {
99106 var v = await promise ;
@@ -109,12 +116,15 @@ export function async_derived(fn) {
109116 } catch ( e ) {
110117 handle_error ( e , parent , null , parent . ctx ) ;
111118 } finally {
112- unsuspend ( ) ;
119+ if ( deferred && ( value . f & IS_DEFERRED ) !== 0 ) {
120+ value . f ^= IS_DEFERRED ;
121+ }
122+ unsuspend ?. ( ) ;
113123
114124 // TODO we should probably null out active effect here,
115125 // rather than inside `restore()`
116126 }
117- } , IS_ASYNC ) ;
127+ } , IS_ASYNC | ( deferred ? IS_DEFERRED : 0 ) ) ;
118128
119129 return Promise . resolve ( promise ) . then ( ( ) => value ) ;
120130}
0 commit comments