Como se explico en el post anterior, Javascript sufre de problemas de concurrencia si a la hora de asociar una función a un evento determinado, ésta función tarda más en ejecutarse que el procesado de la función.

interval2Esto hace que por defecto el navegador encole y acumule todas estas instrucciones y se vayan ejecutando unas detras de otras incluso cuando no le toca.

Un ejemplo práctico de esto es el desarrollo de una aplicación para móvil con Phonegap. Phonegap es un Framework que interpreta una aplicación como si de una página web se tratara y contiene una serie de funciones en lenguaje Javascript asociados a cada uno de los elementos del móvil, como son la cámara, la orientación, la geolocalización, etc…

Dentro de la documentación para manejar estas opciones del móvil, no solo nos proporcionan la información que podemos sacar de ellos, sino que además podemos beneficiarnos de eventos nuevos además que los que vienen por defecto.

Un caso muy concreto es la actualización de variables de geolocalización. Para ello Phonegap dispone de un manejador de eventos denominado geolocation.watchPosition.

En este ejercicio concreto se puede observar el funcionamiento y cómo se llama a las distintas variables de nuestra posición concreta. Una vez que iniciemos esta función, se ejecutará continuadamente para actualizar la posición del dispositivo.

<!DOCTYPE html>
<html>
  <head>
    <title>Device Properties Example</title>

    <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
    <script type="text/javascript" charset="utf-8">

    // Wait for device API libraries to load
    //
    document.addEventListener("deviceready", onDeviceReady, false);

    var watchID = null;

    // device APIs are available
    //
    function onDeviceReady() {
        // Throw an error if no update is received every 30 seconds
        var options = { timeout: 30000 };
        watchID = navigator.geolocation.watchPosition(onSuccess, onError, options);
    }

    // onSuccess Geolocation
    //
    function onSuccess(position) {
        var element = document.getElementById('geolocation');
        element.innerHTML = 'Latitude: '  + position.coords.latitude      + '<br />' +
                            'Longitude: ' + position.coords.longitude     + '<br />' +
                            '<hr />'      + element.innerHTML;
    }

        // onError Callback receives a PositionError object
        //
        function onError(error) {
            alert('code: '    + error.code    + '\n' +
                  'message: ' + error.message + '\n');
        }

    </script>
  </head>
  <body>
    <p id="geolocation">Watching geolocation...</p>
  </body>
</html>

Se pueden configurar algunas de las opciones, y como hacíamos anteriormente con setTimeOut o setInterval, podemos definir un tiempo de ejecución entre llamada y llamada.

El problema ocurrirá cuando al leer una posición, debemos de clasificar otros datos con respecto al mismo de una lista. Como por ejemplo, comparar con otros datos de geolocalización que tenemos guardados en una base de datos o ejecutar alguna función matemática.

Si tuvieramos por ejemplo 100 puntos con los que comparar, o si el tamaño de este vector es variable o acumulativo, no dispondremos de ninguna manera para identificar el tiempo que nos es necesario entre llamada y llamada para que estos eventos no se encolen y proporcionen al final datos erroneos.