diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2022-12-23 19:46:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-23 19:46:24 +0100 |
commit | 208c91b68f4ae1b59e65acbde3de729e7058bb5e (patch) | |
tree | aa0faab20715baee85b571b151426bf832231eb7 /core | |
parent | 2a61b5fdd444c4b6f47f0e0bfbafe0bd26789d68 (diff) |
fix(core): run macrotasks and next ticks after polling dynamic imports (#17173)
This commit fixes handling of rejected promises in dynamic imports
evaluation.
Previously we were running callbacks for next ticks and macrotasks
_before_ polling
dynamic imports and checked for unhandled rejections immediately after.
This is wrong,
as `unhandledrejection` event is dispatched and its callbacks are run as
macrotasks.
This commit changes order of actions performed by the event loop to
following:
- poll async ops
- poll dynamic imports
- run next tick callbacks
- run macrotask callbacks
- check for unhandled promise rejections
Diffstat (limited to 'core')
-rw-r--r-- | core/runtime.rs | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/core/runtime.rs b/core/runtime.rs index 2e417bb9d..f735f5575 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -1127,12 +1127,7 @@ impl JsRuntime { self.pump_v8_message_loop()?; // Ops - { - self.resolve_async_ops(cx)?; - self.drain_nexttick()?; - self.drain_macrotasks()?; - self.check_promise_exceptions()?; - } + self.resolve_async_ops(cx)?; // Dynamic module loading - ie. modules loaded using "import()" { // Run in a loop so that dynamic imports that only depend on another @@ -1157,9 +1152,13 @@ impl JsRuntime { break; } } - - self.check_promise_exceptions()?; } + // Run all next tick callbacks and macrotasks callbacks and only then + // check for any promise exceptions (`unhandledrejection` handlers are + // run in macrotasks callbacks so we need to let them run first). + self.drain_nexttick()?; + self.drain_macrotasks()?; + self.check_promise_exceptions()?; // Event loop middlewares let mut maybe_scheduling = false; |