Merge branch 'main' into async-fixes

async-fixes-2
Simon Holthausen 2 months ago
commit 1ca795bd8e

@ -195,6 +195,8 @@ export class Batch {
// if we didn't start any new async work, and no async work
// is outstanding from a previous flush, commit
if (this.#async_effects.length === 0 && this.#pending === 0) {
this.#commit();
var render_effects = this.#render_effects;
var effects = this.#effects;
@ -202,8 +204,6 @@ export class Batch {
this.#effects = [];
this.#block_effects = [];
this.#commit();
flush_queued_effects(render_effects);
flush_queued_effects(effects);
@ -544,11 +544,12 @@ function flush_queued_effects(effects) {
var length = effects.length;
if (length === 0) return;
for (var i = 0; i < length; i++) {
var effect = effects[i];
var i = 0;
while (i < length) {
var effect = effects[i++];
if ((effect.f & (DESTROYED | INERT)) === 0) {
if (is_dirty(effect)) {
if ((effect.f & (DESTROYED | INERT)) === 0 && is_dirty(effect)) {
var wv = write_version;
var current_size = /** @type {Batch} */ (current_batch).current.size;
@ -589,15 +590,13 @@ function flush_queued_effects(effects) {
}
current_idx++;
}
i++;
break;
}
}
}
}
for (; i < length; i += 1) {
schedule_effect(effects[i]);
while (i < length) {
schedule_effect(effects[i++]);
}
}

@ -2,14 +2,18 @@ import { flushSync } from 'svelte';
import { test } from '../../test';
export default test({
skip: true,
// For this to work in non-async mode, we would need to abort
// inside `#traverse_effect_tree`, which would be very
// complicated and annoying. Since this hasn't been
// a real issue (AFAICT), we ignore it
skip_no_async: true,
async test({ assert, target, logs }) {
async test({ target }) {
const [open, close] = target.querySelectorAll('button');
flushSync(() => open.click());
flushSync(() => close.click());
assert.deepEqual(logs, [true]);
// if the effect queue isn't aborted after the state change, this will throw
flushSync(() => close.click());
}
});

Loading…
Cancel
Save