cordova-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Joe Bowser (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CB-2963) Javascript callback functions are not executed in the correct order
Date Tue, 09 Apr 2013 18:44:15 GMT

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

Joe Bowser commented on CB-2963:
--------------------------------

[~davide] Also, which versions of Android are exhibiting this behaviour? It's very possible
that certain versions would have the correct behaviour and certain versions would not, so
if you could provide us with more info, that would be greatly appreciated.
                
> Javascript callback functions are not executed in the correct order
> -------------------------------------------------------------------
>
>                 Key: CB-2963
>                 URL: https://issues.apache.org/jira/browse/CB-2963
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: Android
>    Affects Versions: 2.5.0
>            Reporter: Davide Maestroni
>            Assignee: Joe Bowser
>            Priority: Critical
>
> I created an application which sends asynchronous notifications from the native to the
Javascript side. I noticed that in some cases the Javascript code of the callbacks is not
executed in the expected order.
> Let me show an example:
> # a native event trigger a notification to the Javascript side where a callback function
(callback1 - part 1) gets correctly called
> # in the while, on the native side, a different notification is triggered
> # inside the Javascript code of the first callback the cordova.exec() API is issued
> # at this point the Javascript code of the second callback (callback2) is executed sequentially
on the same thread
> # when the second callback completes, the final part of the code in the first callback
(callback1 - part 2) is executed
> So that, if the callback functions are defined as below:
> {noformat}
> function callback1() {
>     <callback1 - part 1>
>     cordova.exec(...);
>     <callback1 - part 2>
> }
> function callback2() {
>     <callback2>
> }
> {noformat}
> the Javascript code gets executed in the following order:
> {noformat}
> <callback1 - part 1>
> cordova.exec(...);
> <callback2>
> <callback1 - part 2>
> {noformat}
> which is not the expected behavior.
> I believe the problem is related to the following lines of code in the _cordova.android.js_
file:
> {noformat}
>         var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson);
>         androidExec.processMessages(messages);
> {noformat}
> which get called if _jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT_.
> That causes enqueued messages to get executed sequentially before the execution of the
first callback is complete.
> An easy fix would be to change the above code into:
> {noformat}
>         var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson);
>         setTimeout(function() {
>                 androidExec.processMessages(messages);
>         }, 0);
> {noformat}
> so that the enqueued messages are processed in the next Javascript loop.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message