[ 
https://issues.apache.org/jira/browse/CB-9256?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15258313#comment-15258313
 ] 

Noah NU commented on CB-9256:
-----------------------------

onDeviceReady is sticky, implying the behaviour should not differ if the events 
are registered after onDeviceReady has fired. I haven't been able to reproduce 
the "different" behaviour, although I can confirm that an error thrown in a 
onDeviceReady callback will prevent execution of all following onDeviceReady 
callbacks.

This is because the thrown exception will cease execution and pass control to 
the first catch block in the call stack. Since Cordova does not define any 
catch block, this prevents any other device ready callbacks from executing. 
This is expected behaviour, and the error should be caught and handled by the 
user.

> Errors in subscribed event callbacks prevent other subscribed callbacks from 
> being invoked
> ------------------------------------------------------------------------------------------
>
>                 Key: CB-9256
>                 URL: https://issues.apache.org/jira/browse/CB-9256
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: CordovaJS
>            Reporter: Steven Wexler
>            Priority: Blocker
>
> Let's say I register two callbacks for the "deviceReady" event before the 
> event fires.  If the first callback hits an error, the second callback will 
> not be invoked
> {code}
> document.addEventListener("deviceready", function () { throw new 
> Error("oops"); });
> document.addeventListener("deviceready", function () { /*never hit*/ });
> {code}
> This behavior differs if the events were registered after the event was fired.
> I think the following code should handle callbacks that fail:
> https://github.com/apache/cordova-js/blob/master/src/common/channel.js#L213
> {code}
> for (var i = 0; i < toCall.length; ++i) {
>   toCall[i].apply(this, fireArgs);
> }
> {code}
> Should be something like:
> {code}
> var errors = [];
> for (var i = 0; i < toCall.length; ++i) {
>   try {
>     toCall[i].apply(this, fireArgs);
>   } catch (e) {
>     errors.push(e);
>   }
> }
> for (var j = 0; j < errors.length; ++j) {
>   (function (arg) {
>     setTimeout(function () { throw errors[arg]; });
>   })(j);
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org
For additional commands, e-mail: issues-h...@cordova.apache.org

Reply via email to