From 0f78e1ece237a7b924ebf6d4687819cf18d7462d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Fri, 3 Jul 2026 23:45:11 +0200 Subject: [PATCH] a stale observer must not update the display (using a WeakMap of the current observer for a given display) closes #174 --- src/runtime/display.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/runtime/display.ts b/src/runtime/display.ts index 97f9b25..5763e39 100644 --- a/src/runtime/display.ts +++ b/src/runtime/display.ts @@ -49,17 +49,21 @@ export function clear(state: DisplayState): void { while (state.root.lastChild) state.root.lastChild.remove(); } +const observers = new WeakMap(); + export function observe(state: DisplayState, {autodisplay, assets, output}: Definition) { - return { + const observer = { _error: false, _node: state.root, // _node for visibility promise pending() { + if (observers.get(state) !== this) return; // stale, e.g., after the cell is redefined if (this._error) { this._error = false; clear(state); } }, fulfilled(value: unknown) { + if (observers.get(state) !== this) return; if (autodisplay) { if (assets && value instanceof Element) mapAssets(value, assets); clear(state); @@ -69,10 +73,13 @@ export function observe(state: DisplayState, {autodisplay, assets, output}: Defi } }, rejected(error: unknown) { + if (observers.get(state) !== this) return; console.error(error); this._error = true; clear(state); displayError(state, error, output); } }; + observers.set(state, observer); + return observer; }