@@ -96,10 +96,13 @@ export function async_derived(fn) {
9696 throw new Error ( 'TODO cannot create unowned async derived' ) ;
9797 }
9898
99- var current = /** @type {Promise<V> } */ ( /** @type { unknown } */ ( undefined ) ) ;
100- var value = source ( /** @type { V } */ ( undefined ) ) ;
99+ /** @type {Promise<V> | undefined } */
100+ var current = undefined ;
101101
102+ /** @type {Source<V> | undefined } */
103+ var value = undefined ;
102104 var derived_promise = derived ( fn ) ;
105+ var ran = false ;
103106
104107 block ( async ( ) => {
105108 var promise = get ( derived_promise ) ;
@@ -108,8 +111,10 @@ export function async_derived(fn) {
108111 var unsuspend = suspend ( ) ;
109112 var fork = active_fork ;
110113
114+ var initing = ! ran ;
115+
111116 try {
112- if ( fork === null ) {
117+ if ( fork === null || initing ) {
113118 current = promise ;
114119 }
115120
@@ -119,21 +124,25 @@ export function async_derived(fn) {
119124 return ;
120125 }
121126
122- if ( fork !== null ) {
123- restore ( ) ;
124-
125- var prev_v = value . v ;
126- var prev_wv = value . wv ;
127-
128- internal_set ( value , v ) ;
129- flush_sync ( ) ;
130-
131- // revert
132- value . v = prev_v ;
133- value . wv = prev_wv ;
134- } else if ( current === promise ) {
135- restore ( ) ;
136- internal_set ( value , v ) ;
127+ if ( value === undefined ) {
128+ value = source ( v ) ;
129+ } else {
130+ if ( fork !== null ) {
131+ restore ( ) ;
132+
133+ var prev_v = value . v ;
134+ var prev_wv = value . wv ;
135+
136+ internal_set ( value , v ) ;
137+ flush_sync ( ) ;
138+
139+ // revert
140+ value . v = prev_v ;
141+ value . wv = prev_wv ;
142+ } else if ( current === promise ) {
143+ restore ( ) ;
144+ internal_set ( value , v ) ;
145+ }
137146 }
138147 } catch ( e ) {
139148 if ( fork !== null ) {
@@ -149,7 +158,11 @@ export function async_derived(fn) {
149158 }
150159 } , IS_ASYNC ) ;
151160
152- return Promise . resolve ( current ) . then ( ( ) => value ) ;
161+ ran = true ;
162+
163+ return Promise . resolve ( current ) . then ( ( ) => {
164+ return /** @type {Source<V> } */ ( value ) ;
165+ } ) ;
153166}
154167
155168/**
0 commit comments