-
Notifications
You must be signed in to change notification settings - Fork 128
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
ng-recaptcha tag <recaptcha> causes error “zone.js: Unhandled Promise rejection” when route changes #123
Comments
It's not necessary to reload a component to get this error - destroying a component containing recaptcha leading to this case |
Does anyone know of a work around with this? |
I had the same error message, but in my case captcha doesn't load anymore ... I have 2 forms with captcha, first time the captcha render properly, but when i navigate between them captcha doesn't load anymore. Only workaround i've found : on form component destroy, remove the captcha element from DOM
Now captcha always load properly, but error message continue to show up... |
I have the same issue, when the error shows up it breaks some other TS I have running on the next page. EDIT: |
Hey folks! Thx for letting me know about this, and I’m sorry that getting back to you took so long. At this point I think I know where the issue is, |
To not keep you folks in the dark, here's a small status update. Why it happens?This error happens due to the following scenario:
Why not just skip invoking
|
Hey @DethAriel, can you paste the link to the |
@SirWojtek the recaptcha core team does not have a public bug tracker (at least not one that I know of). I've submitted an issue to their support team through email, and I followed up again today. First time they recommended me to submit a question to StackOverflow, which I did with no results so far. Let's see if they get back with some hints/workarounds/timelines anytime soon. I would be very happy to bring you the good news today, but right now this is all I've got |
I had someone Ina discord give me something like this which works most of the time but sometimes will still throw errors. @ViewChild('captcha') captcha: ElementRef;
@ViewChild('submit') submit: MatButton;
captchaConnection;
renderCaptcha() {
if (!grecaptcha.render) {
setTimeout(() => {
grecaptcha.render(this.captcha.nativeElement, {
callback: (e) => this.captchaCallback(e)
});
}, 2000)
}
grecaptcha.render(this.captcha.nativeElement, {
callback: (e) => this.captchaCallback(e)
});
} |
@ErraticFox it does not look like this is solving the issue, could you please elaborate on what you mean by "works most of the time"? These errors are thrown when recaptcha is removed from DOM, not when it's rendered |
Anyone solved this error ? I had the same error on angular 4 with recaptcha. |
Trying @DethAriel's workaround on Angular 7, I'm getting:
@DethAriel also writes
I am not sure what this means? If it is pretty bad, does it not actually fix the bug? |
hm, I tried overiding the destroy event as suggested in #123 (comment) and doesn't seems to have any effect |
now with the @DethAriel #123 (comment) |
@matudelatower seems to still work fine for me (see this example), but as I mentioned, this is not a fix, and my current suggestion is to ignore this error and add it to the allow-list in the frontend monitoring tools. |
If someone is facing this issue in ionic/cordova app, i solved it by setting in config.xml, this would also need cordova whitelist plugin |
Has anybody found a solution to avoid this? |
Hello anybody found a solution, now ? maybe we can load script outside angular ? or catch errors manual ? |
I am still testing, but this seemed to work for me.
Then after the form is submitted, I do |
@DethAriel any other updates or responses from the reCaptcha team? |
Google sadly has a bad habit of not providing cleanup functions for their APIs. I have played around a lot with simplified version of the project, having static grecaptcha api loaded in index.html and a tiny component with grecaptcha.render in ngAfterViewInit and different cleanup experiments in ngOnDestroy. |
Hi! Any news from google |
Hey @DethAriel have you tried moving the offending logic outside a zone?
https://angular.io/api/core/NgZone#runoutsideangular Just a thought! |
@johngrimsey No, it does not help. |
Ah well. Still, great lib man. |
Could this be of some help? I'm on mobile so it's difficult to check, but thought I'd share so someone else could try this. Worth a shot. google/recaptcha#269 (comment) |
anyone found a fix for it? I'm still seeing this in version 5 |
As a temporary solution, I use a RouteReuseStrategy. This allows you not to destroy the page (route) where the captcha is used, but to save it to the cache. As a result, the ngOnDestroy method for this component is never called and no error is thrown. The downside of this solution is that the component remains in memory, but in my case it is a small page with a feedback form, so I decided simply ignore it. |
Just adding to this bug. I'm getting the same error using the latest version of ng-recaptcha, but the issue now points to zone.evergreen.js. The original solution provided using main.ts also seems to have no effect. Going to keep working on this issue, but just wanted others to know it can also appear as zone.evergreen.js |
I am also experiencing this! :( |
Wanted to add a couple notes to the group. I spent a good deal of time working on this problem, looking at alternative libraries on github, and going so far as to even write my own component to take a fresh perspective. Long story short, I think the ng-recaptcha library is good. A couple notes...
I've got an improved workaround solution to the problem I think, but still need to do some final testing. I'll post an update here shortly in the next day or two with an update. |
Hi all! Last week, I also ran into this problem myself. app.component.html:
Then I implemented a service for offering the token as an observable to components in which I'm using recaptcha, so they can subscibe to the event: captchav2.service.ts:
To wire the service with the actual callback method: app.component.ts
Then in the component, in which I want to use recaptcha (in my case, it is a component for registration): register.component.ts:
So my solution works by having a single instance of the ng-recaptcha component throughout the entire application. In my case, it's good enough. This solution probably won't work properly if you need to have multiple instances of the ng-recaptcha component for whatever reason. I advise you to have the badge hidden by default:
Then, you can either un-hide the badge on the pages you want to use it (this can be tricky!), or just include the text suggested by google on the page:
Note, that I'm not legally responsibe for the validity of this information, so you better check out Google's the terms on this matter What do you think of that? |
The answer posted by @gyomi95 is what I was planning to do as well, got busy last week on other projects. Basically the issue is not easy to fix until Google deals with it, so the best path is to create it at the root so its not destroyed and you can reuse it across components. |
While I hope the above suggestion helps someone, I would like to point out few disadvantages to consider while using it:
|
@DethAriel are there any news regarding this issue? It happens also for ng-recaptcha v 5.0.0. |
@DethAriel Your solution seems to work (latest version on a angular 10 project). I know it's a temporary solution but it's still better than nothing! |
Anyone solved this error ? |
This issue still exists in "ng-recaptcha": "^10.0.0" |
This issue still exists in "11.0.0"..... |
Hey @corpulent I'm unsure where your subscription here comes from, could you please elaborate as I would also like to try and implement this fix
EDIT: |
In search of a solution to the error, I noticed that by adding the following entry to the component, the error disappears.
|
Is this problem serious and needs to be fixed or can I ignore it? Thank you |
I'm no longer using this implementation so you can ignore if you'd like, but I'm sure I'm not the only one with the same issue. |
I would vote for a fix if possible. |
In version 15 of Angular, the following worked for me: |
[Maintainer update 2022-09-26]
Please see this comment.
Summary
I'm submitting a:
Description
I'm using "ng-recaptcha" on Angular component. Im using inside a form like this:
Everything seems to be working fine. However, when route changes (ex. user goes to another page) and the AboutComponent is rendered again, an error pops up (multiple times): Unhandled Promise rejection: timeout ; Zone: ; Task: Promise.then ; Value: timeout undefined. I'm 99% sure it's caused by tag because error doesn't show up after removing the tag. Is there a way to render a captcha without errors when route changes (and captcha reloads after im back to component)?
Obs: You must wait a few seconds after navigating to another route and back to captcha, then Promise timeout expires and error shows up inside console (google/firefox)
https://stackblitz.com/edit/angular-en3spw
Lib versions:
tsc --version
): 2.9.2The text was updated successfully, but these errors were encountered: