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

abortar peticiones anteriores

Estas en el tema de abortar peticiones anteriores en el foro de Frameworks JS en Foros del Web. buenas amigos del foro,... Tengo el siguiente código... index.php @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código javascript : Ver original <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html> ...
  #1 (permalink)  
Antiguo 30/10/2008, 11:52
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
abortar peticiones anteriores

buenas amigos del foro,...

Tengo el siguiente código...

index.php

Código javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  2.    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6. <script type="text/javascript">
  7. function objetoAjax(){
  8.     var xmlhttp=false;
  9.     try {
  10.         xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  11.     } catch (e) {
  12.         try {
  13.            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  14.         } catch (E) {
  15.             xmlhttp = false;
  16.     }
  17.     }
  18.  
  19.     if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  20.         xmlhttp = new XMLHttpRequest();
  21.     }
  22.     return xmlhttp;
  23. }
  24.  
  25. function detectkey(evt,obj) {
  26. keycode = (evt.keyCode==0) ? evt.which : evt.keyCode;
  27. if (keycode!=8) {
  28.     cadena=obj.value + String.fromCharCode(keycode);
  29.     pagina='filtra.php?cadena='+cadena;
  30. }else {
  31.     obj.value="";
  32.     pagina='filtra.php';
  33. }
  34.     divcontenido = document.getElementById('tabla_usuarios');
  35.     ajax=objetoAjax();
  36.     ajax.open("POST", pagina, true);
  37.     ajax.onreadystatechange=function() {
  38.       if (ajax.readyState==4) {
  39.         divcontenido.innerHTML = ajax.responseText
  40.       }
  41.     }
  42.     ajax.send(null);
  43. }
  44. </script>
  45. </head>
  46. <body>
  47.  
  48. <input type="text" name="nom" id="nom" value="" size="30" maxlength="30" onkeypress="detectkey(event,this)">
  49. <br />
  50. <div id="tabla_usuarios"></div>
  51. </body>
  52. </html>


filtra.php

Código php:
Ver original
  1. <?PHP
  2. if (isset($_REQUEST['cadena'])) {
  3.    $_REQUEST['cadena'];
  4.    $query="SELECT nombre,apellido FROM usuarios WHERE (nombre like 'cadena%')";
  5. }else $query="SELECT nombre,apellido FROM usuarios";
  6.  
  7.       $conexion = mysql_connect ($host, $usser, $pass)
  8.          or die ("No se puede conectar con el servidor");
  9.  
  10.       mysql_select_db ("prueba")
  11.          or die ("No se puede seleccionar la base de datos");
  12.      
  13.       $consulta=mysql_query($query,$conexion);
  14. ?>
  15. <TABLE>
  16. <TBODY>
  17. <TR>
  18. <TH>Nombre</TH>
  19. <TH>Apellido</TH>
  20. </TR>
  21. <?PHP
  22.       while($row = mysql_fetch_array($consulta)) {
  23.           echo "<TR>";
  24.           echo "<TD>".$row['nombre']."</TD>";
  25.           echo "<TD>".$row['apellido']."</TD>";
  26.           echo "</TR>";
  27.       }
  28. ?>
  29. </TBODY>
  30. </TABLE>

La función del código es la siguiente:

Al abrir index.php el navegador presenta un textfield. Cuando tu ingresas un caracter en él, por medio del evento onkeypress, se realiza una petición al servidor mandándole el contenido del textfield. Con esta cadena el servidor realiza un select a una tabla, monta un <table> con el resultado de la consulta y lo envia al cliente que lo inserta en el <div id="tabla_usuario">. El script funciona correctamente y si la consulta anda rapìda parece que estemos haciendo un filtro en el momento.

El problema esta en que realiza una petición por cada tecla que se pulsa y pienso que esto no debe ser muy eficiente.

¿Existiría alguna forma de ir matando los procesos ajax anteriores? es decir, que cuando pulsemos la segunda tecla abortemos la 1ª petición, cuando pulsemos la 3ª vez abortemos la 2ª, y asi sucesivamente teniendo sólo en ejecución la última petición.

No se si abrá alguna solución para esto pero llevo días dándole vueltas y no he dado con nada. Va a ser que se me queda grande...

Muchisimas gracias solamente por leerme y si me hechan un cable pues más gracias aun...

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #2 (permalink)  
Antiguo 30/10/2008, 11:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: abortar peticiones anteriores

Hola matak,

Busca en el foro, inclusive abajo de este tema hay uno que tiene la solución, llama al método abort() del objeto XMLHTTPRequest.

Saludos.
  #3 (permalink)  
Antiguo 30/10/2008, 12:06
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: abortar peticiones anteriores

Gracias GatorV por contestar...

Vi el post que me comentas y me puse a buscar info... pero no me quedó muy claro como emprearlo (¿¿ajax.abort()??), como identificar el objeto ajax que quiero destruir(ya que es el anterior) y mucho menos donde colocarlo en mi código...

Al verme en un mar de dudas puse el post aver si alguien me podía hechar una mano

Gracias y Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #4 (permalink)  
Antiguo 31/10/2008, 02:25
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: abortar peticiones anteriores

He estado documentandome y aunque no se mucho más que ayer si no me equivoco:
abort:

"El método abort detiene todas las conexiones asíncronas abiertas por el objeto XMLHttpRequest y lo reinicializa poniendo a cero su estado (readyState)"

oXMLHttpRequest - Objeto XMLHttpRequest

oXMLHttpRequest.abort ();


El problema es que tengo una función que se va ejecutando periódicamente cada 1 min. haciendo uso de setInterval(), ésta crea una petición ajax. Si no me equivoco usando el método abort detendría también este proceso,no?Mi duda es si también truncaría la periodicidad de la función, o seguiría ejecutándose al minuto siguiente.

Gracias y Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #5 (permalink)  
Antiguo 31/10/2008, 10:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: abortar peticiones anteriores

Hola matak,

El método abort solo afecta al request que estas haciendo, si quieres parar el intervalo llama a la función clearInterval de Javascript.

Saludos.
  #6 (permalink)  
Antiguo 03/11/2008, 03:14
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: abortar peticiones anteriores

Gracias GatorV por tu interés.

Hice pruebas con el método abort y no entendía por que no me abortaba los procesos, yo pensaba que abortaba todas la peticiones, tras leer tu contestación me quedó claro. Abort sólo afecta al request que estas usando. Con lo cual no me aborta los anteriores

Con respecto a la función de setInterval ningun problema, precisamente lo que quiero es que no se me trunque.

Como podría hacer para detener los anteriores segun el código que puse anteriormente???

Muchas gracias de antemano

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #7 (permalink)  
Antiguo 03/11/2008, 11:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: abortar peticiones anteriores

Como te comento debes de usar abort() es la única forma para parar el request activo.

Saludos.
  #8 (permalink)  
Antiguo 05/11/2008, 03:47
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: abortar peticiones anteriores

Claro,claro con abort(), en el post anterior no me refería a hacerlo de otra forma o con otra función, aunque asi haya podido entenderse.

Como podría hacerse algo asi. Voy a intentar explicarlo:

Process 1 ---Primera vez que pulsamos la tecla. p.e. tecla 'm' (suponagamos que a este proceso le cuesta 15seg)
________________________________________________
| function detectkey(evt->'m',obj->'') { //buscar por 'm'
| .....
| ajax_anterior.abort();
| ajax=objetoAjax()
| ......
|_}_____________________________________________


Process 2 ---Segunda vez que pulsamos la tecla. p.e. tecla 'a'
_________________________________________________
| function detectkey(evt->'a',obj->'m') { //buscar por 'ma'
| .....
| ajax_anterior.abort();
| ajax=objetoAjax()
| ......
|_}______________________________________________

Supongamos que pulsamos la letra 'm' y al paso de 1 seg pulsamos la 'a'. En este momento se debería cancelar el proceso 1 evitando asi los 15 segundos del proceso, pero...¿cómo podría hacer yo para desde el proceso 2 truncar el proceso 1? o lo que es lo mismo ¿cómo podría hacer para que ajax_anterior hiciera referencia al objeto anterior?

Gracias de antemano,...

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #9 (permalink)  
Antiguo 05/11/2008, 09:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: abortar peticiones anteriores

Guardalo en una variable global y usa esa variable mejor para rastrear el proceso, por ejemplo:
Código javascript:
Ver original
  1. var ajax = null;
  2. function buscaPorNombre(nombre) {
  3.       if( ajax == null ) {
  4.             ajax = new Ajax();
  5.       }
  6.  
  7.       if( ajax.readyState != 4 || ajax.readyState != 0) {
  8.               ajax.abort();
  9.       }
  10.  
  11.       ajax.open(bla);
  12. }

Saludos.
  #10 (permalink)  
Antiguo 05/11/2008, 10:31
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: abortar peticiones anteriores

Ok, pillo el concepto,...

La verdad, es que es lógico...y es más sencillo de lo que me podía imaginar,...muchas veces para un problema complejo buscamos también una solución compleja olvidando lo sencilla que nos puede hacer la vida una simple variable global,jeje

Lo pruebo e informo de los resultados

de nuevo gracias GatorV por tu paciencia,...

Saludos...
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
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 09:07.