|
|
|
@ -81,9 +81,6 @@ export function derived(fn) {
|
|
|
|
return signal;
|
|
|
|
return signal;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Used for waterfall detection
|
|
|
|
|
|
|
|
var async_deps = new Set();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @template V
|
|
|
|
* @template V
|
|
|
|
* @param {() => Promise<V>} fn
|
|
|
|
* @param {() => Promise<V>} fn
|
|
|
|
@ -100,12 +97,9 @@ export function async_derived(fn) {
|
|
|
|
var promise = /** @type {Promise<V>} */ (/** @type {unknown} */ (undefined));
|
|
|
|
var promise = /** @type {Promise<V>} */ (/** @type {unknown} */ (undefined));
|
|
|
|
var value = source(/** @type {V} */ (undefined));
|
|
|
|
var value = source(/** @type {V} */ (undefined));
|
|
|
|
|
|
|
|
|
|
|
|
var current_deps = new Set(async_deps);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var derived_promise = derived(fn);
|
|
|
|
var derived_promise = derived(fn);
|
|
|
|
|
|
|
|
|
|
|
|
block(async () => {
|
|
|
|
block(async () => {
|
|
|
|
var effect = /** @type {Effect} */ (active_effect);
|
|
|
|
|
|
|
|
var current = (promise = get(derived_promise));
|
|
|
|
var current = (promise = get(derived_promise));
|
|
|
|
|
|
|
|
|
|
|
|
var restore = capture();
|
|
|
|
var restore = capture();
|
|
|
|
@ -114,24 +108,6 @@ export function async_derived(fn) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
var v = await promise;
|
|
|
|
var v = await promise;
|
|
|
|
|
|
|
|
|
|
|
|
// check to see if we just created an unnecessary waterfall
|
|
|
|
|
|
|
|
if (current_deps.size > 0) {
|
|
|
|
|
|
|
|
var justified = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (effect.deps !== null) {
|
|
|
|
|
|
|
|
for (const dep of effect.deps) {
|
|
|
|
|
|
|
|
if (current_deps.has(dep)) {
|
|
|
|
|
|
|
|
justified = true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!justified) {
|
|
|
|
|
|
|
|
w.await_waterfall();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((parent.f & DESTROYED) !== 0) {
|
|
|
|
if ((parent.f & DESTROYED) !== 0) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -139,17 +115,6 @@ export function async_derived(fn) {
|
|
|
|
if (promise === current) {
|
|
|
|
if (promise === current) {
|
|
|
|
restore();
|
|
|
|
restore();
|
|
|
|
internal_set(value, v);
|
|
|
|
internal_set(value, v);
|
|
|
|
|
|
|
|
|
|
|
|
// make a note that we're updating this derived,
|
|
|
|
|
|
|
|
// so that we can detect waterfalls
|
|
|
|
|
|
|
|
async_deps.add(value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO we want to clear this after we've updated effects.
|
|
|
|
|
|
|
|
// `queue_micro_task` appears to run too early.
|
|
|
|
|
|
|
|
// for now, as a POC, use setTimeout
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
|
|
async_deps.delete(value);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
handle_error(e, parent, null, parent.ctx);
|
|
|
|
handle_error(e, parent, null, parent.ctx);
|
|
|
|
|