Skip to content

Conversation

Rich-Harris
Copy link
Member

slightly different approach to #16935

Copy link

changeset-bot bot commented Oct 13, 2025

⚠️ No Changeset found

Latest commit: 769dd7d

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copy link
Contributor

Playground

pnpm add https://pkg.pr.new/svelte@16936

d.resolve(v);
}
}, d.reject);
Promise.resolve(fn()).then(d.resolve, d.reject).then(unset_context);
Copy link
Member

@dummdidumm dummdidumm Oct 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be good to have a comment explaining why we want to have it up here in addition to the handler below, but otherwise lgtm 👍

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually you know what? we don't need the unset_context below, just here (and in the catch clause)

Copy link
Member

@dummdidumm dummdidumm Oct 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think so - when you reject a stale promise you'll end up in the handler and need to unset the context there because it doesn't run this line. The previous version was more correct

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? The point of #16935 is that context is saved in fn() but may not be correctly unset if the promise is forcibly rejected before fn() resolves. When that happens, there's nothing to unset, surely?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most likely yes, if everything's correct elsewhere it should be null going in. So yeah, I guess your change is fine

@Rich-Harris Rich-Harris merged commit e1e04d0 into promise-stale-fix Oct 13, 2025
14 checks passed
@Rich-Harris Rich-Harris deleted the promise-stale-fix-alternative branch October 13, 2025 20:23
Rich-Harris added a commit that referenced this pull request Oct 13, 2025
* fix: unset context on stale promises

When a stale promise is rejected in `async_derived`, and the promise eventually resolves, `d.resolve` will be noop and `d.promise.then(handler, ...)` will never run. That in turns means any restored context (via `(await save(..))()`) will never be unset. We have to handle this case and unset the context to prevent errors such as false-positive state mutation errors

* fix: unset context on stale promises (slightly different approach) (#16936)

* slightly different approach to #16935

* move unset_context call

* get rid of logs

---------

Co-authored-by: Rich Harris <rich.harris@vercel.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants