← Back to all briefs
JavaScript50s read

Promise.try() Stops Double-Wrapping Promises in WebKit and Firefox 156

Safari Technology Preview 252 and Firefox 156 both moved `Promise.try()` onto `PromiseResolve`, so the promise your callback returns comes back unwrapped and keeps its identity.

Safari Technology Preview 252, released September 11, 2026, changed Promise.try() to run its callback's result through PromiseResolve, so a returned promise comes back unwrapped. Firefox 156 shipped the same change.

Firefox's entry cites Bug 2062293, which frames the fix as tracking a normative spec change. The observable behavior: Promise.try(() => p) === p is true when p is a native promise. Reading a promise back out of Promise.try() now hands you the same object, instead of a wrapper sitting in front of it.

The blast radius is narrow but real, and this is not a feature launch. If you compare promise identity after Promise.try(), or if some code depended on that extra wrapping layer for timing, behavior changes. Both engines moved in the same direction inside the same fortnight, so this is convergence on the spec rather than a vendor divergence.

Test any code that does an identity check on the value returned by Promise.try(), and drop any shim you wrote to normalize the old wrapping. If your code only calls Promise.try() and awaits the result, you have nothing to change: only the identity of the returned promise differs.