Foros del Web » Programando para Internet » Javascript » Frameworks JS »

ajax asincrono

Estas en el tema de ajax asincrono en el foro de Frameworks JS en Foros del Web. Buenas, Tengo un problema al realizar multiples llamadas ajax con el framework jquery. Resulta que al realizar muchas llamadas seguidas, no se por que motivo ...
  #1 (permalink)  
Antiguo 20/07/2011, 08:30
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 15 años, 5 meses
Puntos: 5
ajax asincrono

Buenas,
Tengo un problema al realizar multiples llamadas ajax con el framework jquery. Resulta que al realizar muchas llamadas seguidas, no se por que motivo me realiza las llamadas como si fueran sincronas, incluso poniendo el async = true

Es decir, tengo una llamada que tarda 30 segundos, y si durante esos 30 segundos hago otra llamada ajax, se queda en espera hasta que la de 30 segundos termina.

He estado mirando tanto la documentacion como otros ejemplos y no hay forma :S...

Este es el codigo que utilizo:
Código Javascript:
Ver original
  1. $.post(ruta_ajax, variables, function(data){
  2. });

También con ajax
Código Javascript:
Ver original
  1. $.ajax({
  2.                     url: ruta_ajax,
  3.                     cache: false,
  4.                     data: variables,
  5.                     async: true,
  6.                     type: 'POST',
  7.                     success: function(data, status) {
  8.                     }
  9. });


Alguna idea de que puede estar pasando??
  #2 (permalink)  
Antiguo 20/07/2011, 09:34
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 11 meses
Puntos: 65
Respuesta: ajax asincrono

¿estas usando sesiones con php en esos script que llamas?
  #3 (permalink)  
Antiguo 20/07/2011, 15:16
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: ajax asincrono

Lo que estoy haciendo con ese script realmente es una tecnica llamada long polling, es para un chat, y para evitar estar llamando cada X segundos a un script lo que hago es que el script esté 60 segundos en un while, para que si hay mensajes nuevos los traiga y termine la peticion ajax llamandola de nuevo. Pero bueno, entiendas o no lo que es un long polling lo mas importante a saber ahi es que es una llamada ajax a un script que usa bases de datos, sesiones,...

Con lo que la respuesta es si, si que uso sesiones, y casi todo lo tipico usado en un script comun de php.
¿Por que dices eso? No entiendo a donde quieres llegar.
Un saludo!
  #4 (permalink)  
Antiguo 20/07/2011, 15:57
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 11 meses
Puntos: 65
Respuesta: ajax asincrono

Porque tenés abierta una sesión y hasta que el script no termine no se cierra, salvo que uses session_write_close
fijate las descripción como funciona la sesión http://php.net/manual/es/function.se...rite-close.php


y probá esto:

Código PHP:
Ver original
  1. sleep(5);
  2. echo "Hola";

Abrí 2 pestañas y ejecuta ese script uno tras otro, el primero deberia terminar en 5 segundos claro está que es por el sleep y el segundo deberia terminar un ratito después que el primero porque no creo que hayas tardado mucho en ejecutar el segundo je pero no, termina 5 segundos contados a partir de que el primer script termine je

y cerrando no pasa eso
Código PHP:
Ver original 

Última edición por Dany_s; 20/07/2011 a las 16:19
  #5 (permalink)  
Antiguo 20/07/2011, 17:13
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: ajax asincrono

Increible pero cierto! Ahi estaba el problema!!!, tengo este script para testear:
Código Javascript:
Ver original
  1. <?php /*
  2.  
  3. Author:   Luis Siquot
  4. Purpose:  Check ajax performance and errors
  5. License:  GPL
  6. site5:    Please don't drop json requests (nor delay)!!!!
  7.  
  8. */
  9.  
  10. $r = (int)$_POST['r'];
  11. $w = (int)$_POST['w'];
  12. if($r) {
  13. session_start();
  14. session_write_close();
  15.  
  16.     /*if($r < 5){
  17.     sleep($w + 15);
  18.     }else{*/
  19.      sleep(rand(1,5));    
  20.     //}
  21.    echo $_POST['r'];
  22.    die ();
  23. }  //else
  24. ?><head>
  25. <script type="text/javascript" src="jquery.js"></script>
  26. <script type="text/javascript">
  27.  
  28. var _settimer;
  29. var _timer;
  30. var _waiting;
  31.  
  32. $(function(){
  33.   clearTable();
  34.   $('#boton').bind('click', donow);
  35. })
  36.  
  37. function donow(){
  38.   var w;
  39.   var estim = 0;
  40.   _waiting = $('#total')[0].value * 1;
  41.   clearTable();
  42.   for(var r=1;r<=_waiting;r++){
  43.        w = Math.floor(Math.random()*6)+2;
  44.        estim += w;
  45.        dodebug({r:r, w:w});
  46.        
  47.        $.post("index2.php", {r:r, w:w}, function(data){
  48.        console.log(data);    
  49.        });
  50.        
  51.        /*
  52.        $.ajax({url: '<?php echo $_SERVER['SCRIPT_NAME']; ?>',
  53.                data:    {r:r, w:w},
  54.                dataType: 'json',   // 'html',
  55.                type: 'GET',
  56.                success: function(CBdata, status) {
  57.                CBdebug(CBdata);
  58.                }
  59.        });
  60.        */
  61.   }
  62.   doStat(estim);
  63.   timer(estim+10);
  64. }
  65.  
  66. function doStat(what){
  67.     $('#stat').replaceWith(
  68.        '<table border="0" id="stat"><tr><td>Request Time Sum=<th>'+what+
  69.        '<td>&nbsp;&nbsp;/2=<th>'+Math.ceil(what/2)+
  70.        '<td>&nbsp;&nbsp;/3=<th>'+Math.ceil(what/3)+
  71.        '<td>&nbsp;&nbsp;/4=<th>'+Math.ceil(what/4)+
  72.        '<td>&nbsp;&nbsp;/6=<th>'+Math.ceil(what/6)+
  73.        '<td>&nbsp;&nbsp;/8=<th>'+Math.ceil(what/8)+
  74.        '<td> &nbsp; (seconds)</table>'
  75.     );
  76. }
  77.  
  78. function timer(what){
  79.   if(what)         {_timer = 0; _settimer = what;}
  80.   if(_waiting==0)  {
  81.     $('#showTimer')[0].innerHTML = 'completed in <b>' + _timer + ' seconds</b> (aprox)';
  82.     return ;
  83.   }
  84.   if(_timer<_settimer){
  85.      $('#showTimer')[0].innerHTML = _timer;
  86.      setTimeout("timer()",1000);
  87.      _timer++;
  88.      return;
  89.   }
  90.   $('#showTimer')[0].innerHTML = '<b>don\'t wait any more!!!</b>';
  91. }
  92.  
  93.  
  94. function CBdebug(what){
  95.     _waiting--;
  96.     $('#req'+what.r)[0].innerHTML = 'x';
  97. }
  98.  
  99.  
  100. function dodebug(what){
  101.     var tt = '<tr><td>' + what.r + '<td>' + what.w + '<td id=req' + what.r + '>&nbsp;'
  102.     $('#debug').append(tt);
  103. }
  104.  
  105.  
  106. function clearTable(){
  107.     $('#debug').replaceWith('<table border="1" id="debug"><tr><td>Request #<td>Wait Time<td>Done</table>');
  108. }
  109.  
  110.  
  111. </script>
  112. </head>
  113. <body>
  114. <center>
  115. <input type="button" value="start" id="boton">
  116. <input type="text" value=8 id="total" size="2"> concurrent json requests
  117. <table id="stat"><tr><td>&nbsp;</table>
  118. Elapsed Time: <span id="showTimer"></span>
  119. <table id="debug"></table>
  120. </center>
  121. </body>


Aunque está un poco modificado el script para simplificarlo rapidamente he podido comprobar lo que comentabas...

Ahora empieza la tarea dificil, ver como termino las sesiones al principio del script siempre, y iniciarlas al final del script solo un instante para sobreescribir resultados... espero que no me cueste mucho ^^

Gracias!
  #6 (permalink)  
Antiguo 20/07/2011, 19:41
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: ajax asincrono

Yeaaaah!! En el caso mas importante he conseguido implementarlo. Muchisimas gracias!

Etiquetas: jquery
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 19:57.