Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bug: exception in an async componentWillLoad method will break the rendering cycle #5824

Closed
3 tasks done
wittemann opened this issue Jun 10, 2024 · 3 comments · Fixed by #5826 or ionic-team/ionic-framework#29666
Closed
3 tasks done
Labels
Bug: Validated This PR or Issue is verified to be a bug within Stencil

Comments

@wittemann
Copy link

Prerequisites

Stencil Version

v4.18.3

Current Behavior

The test setup contains two components, one parent component and one child. The child component does have an issue and throws an error in its componentWillLoad function. Depending on the type of function (async or not) the code will behave different.

The sync case

componentWillLoad() {
  throw new Error('my child error');
}

The error will be logged to the console but the whole application sill works as good as possible. The parent seems to be unaffected by that and the child component has been rendered.

The async case

async componentWillLoad() {
  throw new Error('my child error');
}

The behavior changes and the rendering of the child and the parent is stoped. The child is also not rendered. It seems to be in a state where it can not recover and keep on working.

Expected Behavior

The async case should behave like the sync case. In any case, the child should not be able to break the rendering cycle of the parent.

System Info

System: node 22.2.0
    Platform: darwin (23.5.0)
   CPU Model: Apple M2 Pro (10 cpus)
    Compiler: /Users/mw/workspace/experiments/willoadexception/node_modules/@stencil/core/compiler/stencil.js
       Build: 1716921701
     Stencil: 4.18.3 😄
  TypeScript: 5.4.5
      Rollup: 2.56.3
      Parse5: 7.1.2
      jQuery: 4.0.0-pre
      Terser: 5.31.0

Steps to Reproduce

  • Clone and run the demo application
  • Click the button to show the child component
  • Current result will be a stoped rendering cycle of the parent

Code Reproduction URL

https://github.com/wittemann/async-componentWillLoad-issue

Additional Information

I tried to dig down into the stencil code a bit and it seems to be rooted here:
https://github.com/ionic-team/stencil/blob/main/src/runtime/update-component.ts#L98
In the async case, the safeCall method will not catch the exception and with that, the returned promise will go into the enqueue function which is waiting for the promise to be fulfilled which will never happen as it will be rejected. Therefore, the updateComponent function is not going to be called.

@ionitron-bot ionitron-bot bot added the triage label Jun 10, 2024
@tanner-reits tanner-reits self-assigned this Jun 11, 2024
@tanner-reits
Copy link
Member

Hey @wittemann 👋

Can confirm there is a discrepancy between Stencil handling errors in synchronous and async lifecycle methods. I'm working on a solution and should have a fix up soon, hopefully 🤞

Thanks for reporting!

@tanner-reits tanner-reits removed their assignment Jun 12, 2024
@tanner-reits tanner-reits added Bug: Validated This PR or Issue is verified to be a bug within Stencil and removed triage labels Jun 12, 2024
@wittemann
Copy link
Author

Thanks for the quick fix @tanner-reits. Much appreciated!

@tanner-reits
Copy link
Member

A fix for this was included in today's v4.19.0 release!

github-merge-queue bot pushed a commit to ionic-team/ionic-framework that referenced this issue Jun 26, 2024
### Release Notes

<details>
<summary>ionic-team/stencil (@&#8203;stencil/core)</summary>

###
[`v4.19.0`](https://github.com/ionic-team/stencil/blob/HEAD/CHANGELOG.md#-4190-2024-06-26)

[Compare
Source](https://github.com/ionic-team/stencil/compare/v4.18.3...v4.19.0)

### Bug Fixes

* **compiler:** support rollup's external input option
([#3227](ionic-team/stencil#3227))
([2c68849](ionic-team/stencil@2c68849)),
fixes [#3226](ionic-team/stencil#3226)
* **emit:** don't emit test files
([#5789](ionic-team/stencil#5789))
([50892f1](ionic-team/stencil@50892f1)),
fixes [#5788](ionic-team/stencil#5788)
* **hyrdate:** support vdom annotation in nested dsd structures
([#5856](ionic-team/stencil#5856))
([61bb5e3](ionic-team/stencil@61bb5e3))
* label attribute not toggling input
([#3474](ionic-team/stencil#3474))
([13db920](ionic-team/stencil@13db920)),
fixes [#3473](ionic-team/stencil#3473)
* **mock-doc:** expose ShadowRoot and DocumentFragment globals
([#5827](ionic-team/stencil#5827))
([98bbd7c](ionic-team/stencil@98bbd7c)),
fixes [#3260](ionic-team/stencil#3260)
* **runtime:** allow watchers to fire w/ no Stencil members
([#5855](ionic-team/stencil#5855))
([850ad4f](ionic-team/stencil@850ad4f)),
fixes [#5854](ionic-team/stencil#5854)
* **runtime:** catch errors in async lifecycle methods
([#5826](ionic-team/stencil#5826))
([87e5b33](ionic-team/stencil@87e5b33)),
fixes [#5824](ionic-team/stencil#5824)
* **runtime:** don't register listener before connected to DOM
([#5844](ionic-team/stencil#5844))
([9d7021f](ionic-team/stencil@9d7021f)),
fixes [#4067](ionic-team/stencil#4067)
* **runtime:** properly assign style declarations
([#5838](ionic-team/stencil#5838))
([5c10ebf](ionic-team/stencil@5c10ebf))
* **testing:** allow to re-use pages across it blocks
([#5830](ionic-team/stencil#5830))
([561eab4](ionic-team/stencil@561eab4)),
fixes [#3720](ionic-team/stencil#3720)
* **typescript:** remove unsupported label property
([#5840](ionic-team/stencil#5840))
([d26ea2b](ionic-team/stencil@d26ea2b)),
fixes [#3473](ionic-team/stencil#3473)


### Features

* **cli:** support generation of sass and less files
([#5857](ionic-team/stencil#5857))
([1883812](ionic-team/stencil@1883812)),
closes [#2155](ionic-team/stencil#2155)
* **compiler:** generate export maps on build
([#5809](ionic-team/stencil#5809))
([b6d2404](ionic-team/stencil@b6d2404))
* **complier:** support type import aliasing
([#5836](ionic-team/stencil#5836))
([7ffb25d](ionic-team/stencil@7ffb25d)),
closes [#2335](ionic-team/stencil#2335)
* **runtime:** support declarative shadow DOM
([#5792](ionic-team/stencil#5792))
([c837063](ionic-team/stencil@c837063)),
closes [#4010](ionic-team/stencil#4010)
* **testing:** add `toHaveLastReceivedEventDetail` event spy matcher
([#5829](ionic-team/stencil#5829))
([63491de](ionic-team/stencil@63491de)),
closes [#2488](ionic-team/stencil#2488)
* **testing:** allow to disable network error logging via
'logFailingNetworkRequests' option
([#5839](ionic-team/stencil#5839))
([dac3e33](ionic-team/stencil@dac3e33)),
closes [#2572](ionic-team/stencil#2572)
* **testing:** expose captureBeyondViewport in pageCompareScreenshot
([#5828](ionic-team/stencil#5828))
([cf6a450](ionic-team/stencil@cf6a450)),
closes [#3188](ionic-team/stencil#3188)

</details>
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug: Validated This PR or Issue is verified to be a bug within Stencil
Projects
None yet
2 participants