2011-10-23 16 views
13

Todavía soy nuevo en Javascript. Estoy desarrollando una página simple donde hago clic en un botón para obtener un valor en un servlet y lo visualizo. Funciona bien, a menos que haga clic como loco en el botón. A veces, el resultado mostrado es nulo.¿Las llamadas a los métodos de Javascript son seguras o sincronizadas?

me pregunto si esto es causado por las llamadas simultáneas a la misma función siguiente:

function loadXMLDoc2(retr) { 
    var xmlhttp; 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    xmlhttp.onreadystatechange=function() { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
      $("#" + retr).button('option', 'label', xmlhttp.responseText); 
      // document.getElementById(retr).innerHTML=xmlhttp.responseText; 
     } 
    } 
    var param = "cmd=" + encodeURIComponent(retr); 
    document.getElementById("TOP_LEFT").innerHTML = param; 
    xmlhttp.open("GET","/WebFront/Asynclet?" + param,true); 
    xmlhttp.send(null); 
} 

tiene javascript flujos seguros? Y si no, ¿cómo puedo sincronizar o aislar llamadas a este método?

+0

Creo que la mayoría de los navegadores intentan evitar las condiciones de carrera. No vi ningún bloque de sincronización o similar en JavaScript, ya que está diseñado para ser fácil (y de un solo subproceso). –

Respuesta

31

Aparte de los trabajadores web HTML5 (que están muy estrechamente controlados), Javascript tiene un solo hilo por lo que no hay problemas con la seguridad del hilo. Un hilo de ejecución finalizará antes de que se inicie el siguiente.

Las respuestas como ajax pasan por una cola de eventos y solo se ejecutan cuando ha finalizado cualquier otro hilo de ejecución.

Consulte Do I need to be concerned with race conditions with asynchronous Javascript? para obtener más información.

Para obtener una descripción específica de las devoluciones de llamada de respuesta ajax, consulte How does JavaScript handle AJAX responses in the background?.

4

En el contexto de un navegador, JavaScript es esencialmente de un solo hilo. (Hay algunas características del navegador más nuevas que proporcionan una especie de modelo de subprocesamiento, pero las interacciones de subprocesos son muy limitadas y los datos no se pueden compartir directamente.)

Cuestiones relacionadas