Foros del Web » Programando para Internet » Javascript »

Cómo lograr que no se interrumpa un script de larga duración?

Estas en el tema de Cómo lograr que no se interrumpa un script de larga duración? en el foro de Javascript en Foros del Web. Hola: Tengo un script que consulta una cantidad elevada de posiciones en GoogleMap, y el IE envía un aviso para advertir que la duración del ...
  #1 (permalink)  
Antiguo 12/03/2009, 11:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Exclamación Cómo lograr que no se interrumpa un script de larga duración?

Hola:

Tengo un script que consulta una cantidad elevada de posiciones en GoogleMap, y el IE envía un aviso para advertir que la duración del script es extensa y puede bajar la performance del servidor.
A mí no me importa lo que tarde. Lo que yo necesito es esa info, por lo que necesito que no pregunte si quiero o no seguir. De todos modos, el uso de este script será en PC de dedicación exclusiva y con conexión propietaria a Internet, por lo que no afectará al resto de los usuarios de la red donde se instalará.
¿Alguien me puede explicar cómo hacer para que no interrumpa la ejecución del script, sin importar lo que tarde?

Como alternativa, solamente se me ocurre: ¿hay alguna forma de consultar a GoogleMap un conjunto de posiciones sin enviárselas de a una?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #2 (permalink)  
Antiguo 12/03/2009, 12:43
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Cómo lograr que no se interrumpa un script de larga duración?

Posiblemente estés creando un bucle muy largo. Quizá puedas resolverlo con una función que vuelva a llamarse a sí misma con un setTimeout. Pero sin código sólo podemos adivinar.
  #3 (permalink)  
Antiguo 13/03/2009, 07:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Cómo lograr que no se interrumpa un script de larga duración?

Bueno, el caos se puede ejemplificar con este código:
Código javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4.     <head>
  5.         <title>Ejemplo de geocodificacion</title>
  6.         <meta http-equiv="content-type" content="text/html; charset=utf-8">
  7.         <script src="http://maps.google.com/maps?file=api&amp;v=2.x&amp;key=MiGooglekey"
  8.             type="text/javascript"></script>
  9.         <script type="text/javascript">
  10.     //<![CDATA[
  11.  
  12.     var map;
  13.     var geocoder = null;
  14.     var addressMarker;
  15.     var regs = [
  16.     1,
  17.     2,
  18.     3,
  19.     4,
  20.     5,
  21.     6,
  22.     7,
  23.     8,
  24.     9,
  25.     10,
  26.     11,
  27.     12,
  28.     13,
  29.     14,
  30.     15,
  31.     16,
  32.     17,
  33.     18,
  34.     19,
  35.     20,
  36.     // Aquí van otros 350 ID
  37.     ];
  38.     var lats = [
  39.     18.67708969116211,
  40.     18.51841926574707,
  41.     21.15048980712890,
  42.     21.15048980712890,
  43.     21.15048980712890,
  44.     21.16732025146484,
  45.     18.67708969116211,
  46.     18.51841926574707,
  47.     21.15048980712890,
  48.     21.15048980712890,
  49.     21.15048980712890,
  50.     21.16732025146484,
  51.     18.67708969116211,
  52.     18.51841926574707,
  53.     21.15048980712890,
  54.     21.15048980712890,
  55.     21.15048980712890,
  56.     21.16732025146484,
  57.     18.67708969116211,
  58.     18.51841926574707,
  59.     // Aqui van otras 350 latitudes más.
  60.     ];
  61.     var lngs = [
  62.     -88.39904785156250,
  63.     -88.32911682128906,
  64.     -86.86348724365233,
  65.     -86.86348724365233,
  66.     -86.86348724365233,
  67.     -86.83305358886720,
  68.     -88.39904785156250,
  69.     -88.32911682128906,
  70.     -86.86348724365233,
  71.     -86.86348724365233,
  72.     -86.86348724365233,
  73.     -86.83305358886720,
  74.     -88.39904785156250,
  75.     -88.32911682128906,
  76.     -86.86348724365233,
  77.     -86.86348724365233,
  78.     -86.86348724365233,
  79.     -86.83305358886720,
  80.     -88.39904785156250,
  81.     -88.32911682128906,
  82.     -86.86348724365233,
  83.     // Aqui van otras 350 longitudes más. 
  84.     ];
  85.     var numGeocoded = 0;
  86.     var punto;
  87.     var marker = null;
  88.    
  89.     function geocodeAll() {
  90.       if (numGeocoded < lats.length) {
  91.         punto = new GPoint(lats[numGeocoded],lngs[numGeocoded]);
  92.       geocoder.getLocations(punto, addressResolved);
  93.       }
  94.       else{document.getElementById("terminado").value ="1";}
  95.     }
  96.  
  97.    function addressResolved(response) {
  98.      var delay = 0;
  99.      if (response.Status.code == 620) {
  100.        // Demasiado rápido. Intenta de nuevo pero con una pausa
  101.        delay = 500;
  102.      } else {
  103.        if (response.Status.code == 200) {
  104.             // Obtenida: Se utiliza la direccion
  105.             var dir = response.Placemark[0].address;
  106.             if (dir){
  107.             document.getElementById("geocode").value +=  regs[numGeocoded] + "\t" + dir + "\n";}
  108.             else{document.getElementById("geocode").value += regs[numGeocoded] + "\t" + "Posicion no encontrada" + "\n";}
  109.             numGeocoded += 1;
  110.           }
  111.        
  112.        // Mover puntero a las siguientes coordenadas; si es una posicion falsa, lo saltea.
  113.      }
  114.      window.setTimeout(geocodeAll, delay);
  115.    }
  116.  
  117.     function load() {
  118.       if (GBrowserIsCompatible()) {
  119.         map = new GMap2(document.getElementById("map"));
  120.         map.setCenter(new GLatLng(-34.608175166943,-58.368855956794), 16);
  121.         map.setMapType(G_NORMAL_MAP);
  122.         geocoder = new GClientGeocoder();
  123.         geocoder.setCache(null);
  124.         document.getElementById("geocode").value ="";
  125.         document.getElementById("terminado").value ="0";
  126.        window.setTimeout(geocodeAll, 50);
  127.       }
  128.     }
  129.  
  130.     function addtag(point, dir)
  131.         {
  132.         marker = new GMarker(point,{draggable:false, bouncy:false,clickable:true});
  133.         GEvent.addListener(marker, "click", function(){
  134.             marker.bindInfoWindow(dir);});
  135.         return marker;
  136.         }
  137.  
  138.     //]]>
  139.         </script>
  140.     </head>
  141.     <body onload="load()" onunload="GUnload()">
  142.         <div id="map" style="WIDTH: 150px; HEIGHT: 100px"></div>
  143.         <TEXTAREA id="geocode" style="WIDTH: 152px; HEIGHT: 118px" name="geocod" rows="7" cols="16">
  144.         </TEXTAREA>
  145.         <BR>
  146.         <INPUT id="terminado" type="hidden" name="termino">
  147.     </body>
  148. </html>
En este ejemplo, en un momento dado (aproximadamente unos 10 segundos después) aparece la dichosa ventanita. Después de continuar, vuelve a aparecer en lapsos de tiempo similares, y eventualmente el control desde el codigo VB.net falla porque algún elemento no puede leer una instancia de un objeto durante un ciclo de detenido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:51.