aa-fork
Rich Harris 7 months ago
parent fe79b43e18
commit 2d92d47750

@ -96,10 +96,13 @@ export function async_derived(fn) {
throw new Error('TODO cannot create unowned async derived'); throw new Error('TODO cannot create unowned async derived');
} }
var current = /** @type {Promise<V>} */ (/** @type {unknown} */ (undefined)); /** @type {Promise<V> | undefined} */
var value = source(/** @type {V} */ (undefined)); var current = undefined;
/** @type {Source<V> | undefined} */
var value = undefined;
var derived_promise = derived(fn); var derived_promise = derived(fn);
var ran = false;
block(async () => { block(async () => {
var promise = get(derived_promise); var promise = get(derived_promise);
@ -108,8 +111,10 @@ export function async_derived(fn) {
var unsuspend = suspend(); var unsuspend = suspend();
var fork = active_fork; var fork = active_fork;
var initing = !ran;
try { try {
if (fork === null) { if (fork === null || initing) {
current = promise; current = promise;
} }
@ -119,21 +124,25 @@ export function async_derived(fn) {
return; return;
} }
if (fork !== null) { if (value === undefined) {
restore(); value = source(v);
} else {
var prev_v = value.v; if (fork !== null) {
var prev_wv = value.wv; restore();
internal_set(value, v); var prev_v = value.v;
flush_sync(); var prev_wv = value.wv;
// revert internal_set(value, v);
value.v = prev_v; flush_sync();
value.wv = prev_wv;
} else if (current === promise) { // revert
restore(); value.v = prev_v;
internal_set(value, v); value.wv = prev_wv;
} else if (current === promise) {
restore();
internal_set(value, v);
}
} }
} catch (e) { } catch (e) {
if (fork !== null) { if (fork !== null) {
@ -149,7 +158,11 @@ export function async_derived(fn) {
} }
}, IS_ASYNC); }, IS_ASYNC);
return Promise.resolve(current).then(() => value); ran = true;
return Promise.resolve(current).then(() => {
return /** @type {Source<V>} */ (value);
});
} }
/** /**

Loading…
Cancel
Save