equality check against what the batch sees to update its value

async-another-try
Simon Holthausen 1 week ago
parent bf0ecc0578
commit a7c16935a5
No known key found for this signature in database

@ -443,6 +443,12 @@ export function update_derived(derived) {
return;
}
}
} else if (
batch_values?.has(derived) &&
!derived.equals(/** @type {any[]} */ (batch_values?.get(derived))[0])
) {
current_batch?.capture(derived, derived.v);
// TODO also bump wv_values?
}
// don't mark derived clean if we're reading it inside a

@ -37,7 +37,8 @@ import {
batch_values,
eager_block_effects,
schedule_effect,
legacy_updates
legacy_updates,
current_batch
} from './batch.js';
import { proxy } from '../proxy.js';
import { execute_derived } from './deriveds.js';
@ -272,6 +273,12 @@ export function internal_set(source, value, updated_during_traversal = null) {
if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) {
flush_eager_effects();
}
} else if (
batch_values?.has(source) &&
!source.equals(/** @type {any[]} */ (batch_values?.get(source))[0])
) {
current_batch?.capture(source, source.v);
// TODO also bump wv_values?
}
return value;

@ -0,0 +1,17 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
async test({ assert, target }) {
const [create, commit] = target.querySelectorAll('button');
const [p] = target.querySelectorAll('p');
create.click();
await tick();
assert.htmlEqual(p.innerHTML, '0:0');
commit.click();
await tick();
assert.htmlEqual(p.innerHTML, '0:0');
}
});

@ -0,0 +1,20 @@
<script>
import { fork } from 'svelte';
let source = $state(0);
let writable = $derived(source);
let pending;
</script>
<button onclick={() => {
pending = fork(() => {
source = 1;
source = 0;
writable = 1;
writable = 0;
});
}}>fork</button>
<button onclick={() => pending.commit()}>commit</button>
<p>{source}:{writable}</p>
Loading…
Cancel
Save