That gap shows up as ad-hoc cancellation, fragile cleanup, and async code that no longer behaves like synchronous code once things get even slightly complex.
This post argues that the missing piece isn’t a heavier abstraction, but a small runtime polyfill for structured concurrency: scoped lifetimes, parent/child tasks, and guaranteed cleanup.
Is JavaScript ready for structured concurrency?