Skip to content

Commit 2d92d47

Browse files
committed
fix
1 parent fe79b43 commit 2d92d47

File tree

1 file changed

+32
-19
lines changed
  • packages/svelte/src/internal/client/reactivity

1 file changed

+32
-19
lines changed

packages/svelte/src/internal/client/reactivity/deriveds.js

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)