aa-fork
Rich Harris 8 months ago
parent 0f05cb1cfa
commit 4069441488

@ -96,41 +96,51 @@ export function async_derived(fn) {
throw new Error('TODO cannot create unowned async derived'); throw new Error('TODO cannot create unowned async derived');
} }
var promise = /** @type {Promise<V>} */ (/** @type {unknown} */ (undefined)); var current = /** @type {Promise<V>} */ (/** @type {unknown} */ (undefined));
var value = source(/** @type {V} */ (undefined)); var value = source(/** @type {V} */ (undefined));
var derived_promise = derived(fn); var derived_promise = derived(fn);
block(async () => { block(async () => {
var current = (promise = get(derived_promise)); var promise = get(derived_promise);
var restore = capture(); var restore = capture();
var unsuspend = suspend(); var unsuspend = suspend();
var fork = active_fork;
try { try {
if (fork === null) {
current = promise;
}
var v = await promise; var v = await promise;
if ((parent.f & DESTROYED) !== 0) { if ((parent.f & DESTROYED) !== 0) {
return; return;
} }
if (promise === current) { if (fork !== null) {
restore(); restore();
var prev = { v: value.v, wv: value.wv }; var prev_v = value.v;
var prev_wv = value.wv;
internal_set(value, v); internal_set(value, v);
if (active_fork) {
flush_sync(); flush_sync();
// revert // revert
value.v = prev.v; value.v = prev_v;
value.wv = prev.wv; value.wv = prev_wv;
} } else if (current === promise) {
restore();
internal_set(value, v);
} }
} catch (e) { } catch (e) {
if (fork !== null) {
// TODO reject fork
} else {
handle_error(e, parent, null, parent.ctx); handle_error(e, parent, null, parent.ctx);
}
} finally { } finally {
unsuspend(); unsuspend();
@ -139,7 +149,7 @@ export function async_derived(fn) {
} }
}, IS_ASYNC); }, IS_ASYNC);
return Promise.resolve(promise).then(() => value); return Promise.resolve(current).then(() => value);
} }
/** /**

Loading…
Cancel
Save