Las variables globales en Javascript no se actualizan

He pasado los últimos 30 minutos resolviendo esto.

Supongamos el siguiente caso:

<script>
    var x = 0 ; //global variable
    function compute() {
        x = x+1; 
    }
</script>

¿Debería incrementarse el valor de x para poder acceder a él en una función más adelante?

Tengo los siguientes códigos:

var id1 = 0;
var id2 = 0; 
$.ajax({
    url: "http://localhost/twee/chat/comment",
    type: 'POST',
    data: form_data,
    success: function(data) {
        var data1 = parseInt(data);
        id1 = id2 = data1; 
    }
});

Quiero poder acceder a los valores de id1 e id2 (actualizados desde que los declaré como 0) en una función posterior.

Sin embargo, el valor se mantiene en cero y data1 se recupera correctamente.

preguntado el 12 de junio de 12 a las 18:06

No llames parseInt sin especificar la base con el segundo argumento. developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… -

¿Veo que declaras id1 e id3 y luego pides id2? se lanzará una excepción indefinida -

Los datos se recuperan muy bien. El problema no es con parseInt. -

@TrinhHoangNhu Vi y corregí eso. Lo siento -

3 Respuestas

No sé cuándo intenta usar las ID, pero la llamada ajax es asíncrona, por lo que si intenta leer las variables de esta manera:

var id1 = 0;
var id3 = 0 ; 
$.ajax({
         url: "http://localhost/twee/chat/comment",
         type: 'POST',
         data: form_data,
         success: function(data) {
              var data1 = parseInt(data, 10);
          id1 = id2 = data1;

         alert(id1) // Will alert whatever number returned as data. 
}});

alert(id1) // Will alert 0

La segunda alerta se llamará casi simultáneamente con la llamada ajax, y en ese momento los datos aún no se han actualizado, mientras que la primera alerta no se llamará hasta que los datos hayan regresado. Si va a usar las ID, tendrá que usarlas dentro de su devolución de llamada exitosa, o en una función que se llame dentro de su devolución de llamada exitosa.

Respondido el 12 de junio de 12 a las 18:06

Bien, ¿no puedo asignarlo a una variable global y usarlo? - Dpkg Me

@DpkgMe Bueno, puede asignarlo a una variable global, pero si intenta leer esa variable global fuera de la devolución de llamada exitosa, es probable que la variable aún no se haya configurado, porque los datos no han regresado en eso punto. Es por eso que usa la devolución de llamada exitosa, para que sepa que tiene los datos, antes de usarlos. - cristofer eliasson

Lo anterior parece probable, pero se supone que id1 e id2 están en el mismo ámbito que cualquier función que intente llamarlos. A partir de este fragmento, parecen ser globales. Sin embargo, si este código existe en algún tipo de función contenedora, deberá asegurarse de que las rutinas de llamada estén en el mismo ámbito. - jatrim

Ok, solo iré con mi plan B en su lugar. Estoy usando esto con pusher y enviaré las identificaciones dentro del disparador pusher. Gracias a todos. - Dpkg Me

@jatrim Gracias por la aclaración, asumí que no estaban envueltos por otra función, ya que OP declaró que son globales. - cristofer eliasson

¿Estás seguro de que estás comprobando el valor de id1 después de la success se ejecuta la devolución de llamada? ajax es una operación asincrónica, su devolución de llamada no se llamará hasta que la respuesta regrese del servidor.

Respondido el 12 de junio de 12 a las 18:06

Su devolución de llamada ajax es asíncrona. No ejecutará el success funcionar hasta después de que el servidor remoto responda. Una vez que lo hace, su función se ejecuta y la variable se incrementa.

Esta es una dificultad en la programación Javascript y la programación asincrónica en general: hay varias bolas en el aire a la vez, y es difícil razonar sobre cómo podrían completar sus operaciones y cuándo se pueden ver los resultados.

Es muy fácil pensar en la llamada $.ajax() como "obtener los resultados del servidor", pero en realidad es "hacer una solicitud al servidor". ¿Quién sabe cuándo podría terminar?

Respondido el 12 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.