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