Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: AlbertoBSD en 25 Agosto 2016, 20:20 pm



Título: Acceso asincrono a Variables
Publicado por: AlbertoBSD en 25 Agosto 2016, 20:20 pm
Hola que tal estoy programando una pequeña interfaz y me encuentro con el siguiente problema:

Tengo una varible Array en javascript:

Código
  1. var sucursales = new Array;

Dicha variable se actualiza en tiempo de ejecución mediante la siguiente función:

Código
  1. function lista_sucursal() {
  2. $.ajax({
  3. url: '/get_sucursales.aspx',
  4. type: 'POST',
  5. success: function(data) {
  6. var r = JSON.parse(data);
  7. if(r.ok == true) {
  8. var i = 0;
  9. while (i < r.data.length) {
  10.    sucursales[r.data[i].id] = r.data[i].nombre;
  11.    //Mas codigo irrelevante aqui
  12. i++;
  13. }
  14. }
  15. else {
  16. //Error aqui
  17. }
  18. }
  19. });
  20. }

Dicha funcion se llama al momento de cargar la pagina primero que otras funciones...

Posteriormente tengo otro parte del codigo que hace mas o menos esto:

Código
  1. function maquinas_sucursales_tabla() {
  2. $("#tabla_body").html("");
  3. $.ajax({
  4. url: '/get_maquinas_sucursales.aspx',
  5. type: 'POST',
  6. success: function(data) {
  7. var r = JSON.parse(data);
  8. if(r.ok == true) {
  9. var i = 0;
  10. while(i < r.data.length) {
  11.    $("#tabla_body").append('<tr><td>' + sucursales[r.data[i].sucursal] + '</td></tr>');
  12. i++;
  13. }
  14. }
  15. else {
  16. //ERROR
  17. }
  18. }
  19. });
  20. }

El detalle esta en que hay veces que pone el dato correctamente y otras veces aparece "undefined" y esto es debido a que el codigo del jquery se ejecuta de forma asincrona...

Que recomiendan para solucionar esto, estaba pensando en usar un semaforo como "sucursales_ready" para solo cargar los otros datos cuando la variable ya este lista....

Pero no se, tal vez existe otro metodo mas rapido y/o sencillo.


Saludos!


Título: Re: Acceso asincrono a Variables
Publicado por: ivancea96 en 25 Agosto 2016, 20:37 pm
Puedes guardar los datos recibidos en cada ajax:
Cuando cada uno de ellos termine, los almacenas en la variable que sea.
Cuando lo almacenes, miras si el otro ha terminado también. Si lo ha hecho, pues haces lo que sea.

Otraopción que tienes, es hacer el segundo ajax cuando acabe el primero, con los problemas que eelo conlleva.


Título: Re: Acceso asincrono a Variables
Publicado por: [u]nsigned en 26 Agosto 2016, 18:44 pm
Hola!!! Para estos casos tenes dos alternativas. La primera es llamar a la segunda funcion como callback de la primera, asi te aseguras que se ejecuten una después de otra. Ora forma as profesional de hacer esto es mediante promise (promesas).

Dberias usar $.when() y dentrod e ella llamar a tus funciones asincronas. Otra ventaja de usar promesas en lugar de closures o callbacks es que el flujo de trabajo no se pausa mientras se espera la respuesta a una peticion AJAX.

https://api.jquery.com/jquery.when/
http://rlbisbe.net/2015/04/26/explicando-promises-de-javascript-con-un-ejemplo-simple/

De esta forma se hace en AnguarJS y la verdad es muy superior. Te acostumbras a el y luego jquery te parece algo primitivo en lo que a peticiones XHR se refiere xD


Título: Re: Acceso asincrono a Variables
Publicado por: AlbertoBSD en 26 Agosto 2016, 20:04 pm
Muy buen dia, gracias por las respuestas voy a leer los links que pusieron y los conceptos que mencionan para aprender mas ya que aunque se me da la programación, no tengo tanta experiencia en nivel web.

Cualquier duda que tenga la pondré por aquí.

Saludos!