AJAX - Problema con Javascript - Ajax - Php

 
Vista:
sin imagen de perfil

Problema con Javascript - Ajax - Php

Publicado por celina (2 intervenciones) el 08/04/2015 16:38:24
Buenos dias:

Mi problema es el siguiente..

Tengo una función js que a través de ajax realiza una consulta a la base de datos. Mi función ajax llama a una función "mostrarBusqueda(JSON)" para mostrar el resultado de la búsqueda. JSON es una variable que tiene varios registros, pueden ser libros o revistas.
Dentro de la función "mostrarBusqueda(JSON)" tengo un for que recorre la variable JSON y, según el registro sea libro o revista, debe armar una visualización diferente.

Si es libro, armo dentro de la variable texto el código html para mostrar:

texto +='<br /><a class="link" style="padding:4px; background-color:#069; color:white; float:left" href=# onclick="cargarCatalogoVerMarc('+codigo+', \''+idioma+'\', \''+material+'\');"> <strong>Mas Datos </strong></a> <a class="link" style="padding:4px; background-color:#069; color:white; float:right" href=# onclick= "listarEjemplares('+codigo+','+biblioteca+', \''+autor1+'\', \''+titulo+'\', \''+mencionEdicion+'\', \''+publicacion+'\');"> <strong>Disponibilidad</strong></a><br /> <br /><\hr /></td></tr>';

Si es revista, debo buscar el registro relacionado a la revista, es decir, llamo a una funcion "buscarSManalitica(codigo)" que me devuelve el registro relacionado y ahi puedo armar la variable texto con los datos de ambos registros relacionados.

Esta funcion "buscarSManalitica", a travesde ajax busca el registro relacionado. Cuando intente devolver el registro buscado, me devolvía "undefined", por lo tanto tuve que buscar otra forma de devolverlo. Lo que hice fue guardar el resulado en una variable global "dataArray" y poner una bandera "estadoArray" en true cuando la asignación se complete, para así saber que ya podía acceder al valor.
Sino es true, con setTimeout demoro unos segundos.
De esta forma, no funciona bien, salvo que ponga el alert : alert("alert para que funcione la primera vez")". Poniendo este alert, funciona como deberia funcionar.

Por favor alguien tiene idea de como solucionar esto? No encuentro la forma, ya que por como esta programado debo hacer las subconsultas y generar el html de esta forma.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function buscarSManalitica(codigo,){
var opciones = {
      method:'post',
      parameters:'codigoSMA='+codigo,
      onComplete: function(t) {
               JSON_SM = (eval('(t.responseText)'));
	       JSON_SM = JSON_SM.parseJSON('('+t.responseText+')');
               dataArray = JSON_SM;
	       estadoArray = true;
      }
   }
   str = 'busquedaWeb/busqWeb.php';
   new Ajax.Request(str, opciones);
 
var check = function(){
 
alert("alert para q funcione de una vez");
 
                    if(estadoArray == false){
 
			setTimeout(check, 5000);
 
                    }
                    else{
                        return "true";
                    }
 
                }
 
return check();
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Vainas
Val: 47
Ha mantenido su posición en AJAX (en relación al último mes)
Gráfica de AJAX

Problema con Javascript - Ajax - Php

Publicado por Vainas (71 intervenciones) el 12/04/2015 19:36:11
Buenas: Aunque el mensaje es un poco viejo respondere igual.

Creo que estas usando la libreria Prototype aunque no dices nada, imagino que es asi por algunas cosas que he visto. Te recomentaria que mirases un poco por aqui http://api.prototypejs.org/ajax/Ajax/Request/ mas que nada por que por ejempo onComplete para mirar si se ha regresado un dato correcto o no hay que hacer mas cosas:

1
2
3
onComplete: function(response) {
    if (200 == response.status)
...

Para comprobar el estado de estadoArray deberias probar usando console.log(estadoArray); dentro de la funtion check asi puedes mirar si su estado es undefine o que esta pasando con el valor.

Al final del todo usas la function check asi "return check();" pero en realidad esta se ejecuta y termina asi que todo esta correcto, que luego la llames varias veces mas regresando en algun momento un true.. aqui me falta algo. Yo veo que lo que pasa es lo correcto: Se llama a check, se comprueba el valor y se pone un timer que ejecutara check() dentro de 5 segundos, se llega al final de la function y como no hay ningun return pues termina sin mas (Ahora mismo me has hecho preguntarme que retorna una function a la que no se le da un return... imagino que un 0 o algo asi).

Deberias mirar una cosa que se llama promesas en Javascript quizas puede solucionar tu problema.

Si en realidad dataArray y estadoArray son globales, en la consola de chrome o firefox.... podrias comprobar pasado un tiempo que su valor cambie. En vez de un setTimeout podrias probar con un while pero hay peligro a colgar la pagina. En fin, mira las promesas que puede que sea una solucion o quizas una llamada a una funcion que pinte despues de que onComplete acabe.

Espero que ayude.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema con Javascript - Ajax - Php

Publicado por celina (2 intervenciones) el 13/04/2015 16:02:32
Muchas gracias por tu respuesta, voy a probar lo que me aconsejas y después comento como lo solucioné!

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema con Javascript - Ajax - Php

Publicado por gloria (1 intervención) el 14/04/2015 17:43:19
Hola me parece muy buena información muchas veces cuando programamos se nos presentan esta clase de errores, y como este es un tema tan extenso no nos es tan sencillo encontrar una solución.
Saludos!!
__________________
Proyecto para cataratas en los ojos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar