Skip to content

Commit 5702db5

Browse files
committed
chunked: clean up abort listeners for suspended boundaries
1 parent 351279d commit 5702db5

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

src/lib/chunked.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,12 @@ function handleError(error, vnode, renderChild) {
9595
const race = new Deferred();
9696

9797
const abortSignal = this.abortSignal;
98+
/** @type {(() => void) | undefined} */
99+
let onAbort;
98100
if (abortSignal) {
99-
// @ts-ignore 2554 - implicit undefined arg
100-
if (abortSignal.aborted) race.resolve();
101-
else abortSignal.addEventListener('abort', race.resolve);
101+
onAbort = () => race.resolve();
102+
if (abortSignal.aborted) onAbort();
103+
else abortSignal.addEventListener('abort', onAbort, { once: true });
102104
}
103105

104106
const promise = error.then(
@@ -112,10 +114,16 @@ function handleError(error, vnode, renderChild) {
112114
this.onError
113115
);
114116

117+
const racedPromise = Promise.race([promise, race.promise]).finally(() => {
118+
if (abortSignal && onAbort) {
119+
abortSignal.removeEventListener('abort', onAbort);
120+
}
121+
});
122+
115123
this.suspended.push({
116124
id,
117125
vnode,
118-
promise: Promise.race([promise, race.promise])
126+
promise: racedPromise
119127
});
120128

121129
const fallback = renderChild(vnode.props.fallback);

0 commit comments

Comments
 (0)