AJAX - PHP y AJAX retraso en la respuesta de AJAX, la respuesta tarda en asignarse...

   
Vista:

PHP y AJAX retraso en la respuesta de AJAX, la respuesta tarda en asignarse...

Publicado por Enrique (1 intervención) el 16/02/2015 18:53:04
Buenas tardes,

Tengo una web que tiene que mostrar unos canvas los cuales construyo a partir de unos datos que tengo en Mysql y luego exporta esos canvas a archivos de imágen en el servidor.

El problema es que cuando el ajax responde (a través del método done de $.post()) parece que por alguna razón no le da tiempo, porque las instrucciones que hacen uso de la respuesta me devuelven un error de null, sin embargo, si al Php que genera el canvas le pongo un sleep(1) al principio de la página, normalmente (aunque no siempre) no tengo problema.

Por una parte tengo:

Una pagina en PHP (llamémosla generaCanvas.php) que a través de un identificador de usuario y un identificador de dibujo que le paso por POST, hace una consulta a la base de datos para tomar coordenadas a dibujar y con esas coordenadas genera un canvas.

Una web con PHP, JS y AJAX (Llamemosla resultados.php) que recibe un id por POST que por medio de una función en php con ese id consulta a la BD cuántos canvas va ha requerir, con el numero de canvas, mediante un bucle en PHP construye unos DIVs con id único que contendrán esos canvas y luego mediante otro bucle hace una llamada a una función que contiene un AJAX que llama a la página generaCanvas.php por POST con el id del sujeto e id del dibujo a generar en el canvas y el id del DIV donde guardaré el dibujo.

En la parte Done de la funcion $.post tengo la asignación del canvas resultante al Div que lo contendrá y luego también hago una llamada a una funcion que salva la imagen a un archivo pasándola el toDataURL del canvas.


La llamada a Ajax la hago por jquery de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$.post("generaCanvas.php", {	sujetoId: "<?php echo $_POST["id"];?>", dibujoID: dibujoId, resultadoID: resultadoId})
				.done(function(respuesta){
                                         //asigno la respuesta (el canvas) al div correspondiente
					$( "#resultado_"+resultadoId ).html( respuesta );
                                        // recupero la referencia al canvas devuelto
					var lienzo=$("#micanvas_<?php echo $id;?>_"+dibujoId);
 
                                        //
					if (contadorCanvas == <?php echo "$numDibujosAMostrar";?>) {
						$("#barraEstado1").html("Dibujos cargados");
					}else{
						$("#barraEstado1").html("Cargando dubujos..");
					}
                                        //Llamo a la función que salva la imágen pasándole el toDataURL del canvas
      				        salvaImagen(lienzo.toDataURL());
				})
				.fail(function(respuesta) {
                                       alert( "error" );
                                 });



El resultado sin poner el sleep(1) en el php es que en la página resultados.php los canvas que devuelve los solapa dentro del último Div que he creado y además en la instrucción var lienzo=$("#micanvas_<?php echo $id;?>_"+dibujoId); de dentro del done devuleve null y por tanto la llamada a salvaImagen() falla.

Con el sleep(1) generalmente suele repartir bien los canvas en sus correspondientes DIVs

No entiendo porqué si las instrucciones están dentro de .done parece que no le da tiempo a procesar la respuesta de ajax y obtengo fallos

La página generaCanvas.php funciona bien de manera individual, y si el sujeto del que saco los resultados sólo tiene un dibujo a mostrar (por tanto el bucle solo hace una iteración) también funciona



Alguna idea después de esta chapa que os he dado??
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

PHP y AJAX retraso en la respuesta de AJAX, la respuesta tarda en asignarse...

Publicado por Vainas (71 intervenciones) el 23/02/2015 09:21:45
Buenas:

Estas realizando varios post a la vez (dentro de un bucle o algo por el estilo)?

Es que si es asi creo que podrias mirar async: false que es parte de la configuracion que se le pasa a la function ajax de jQuery. Un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
$.ajax({
      type: 'POST',
      async: false,
      url: "...",
      data: $(this).serialize(),
      success: function(datos){
        alert('ok');
      },
      error: function(xhr, status, err) {
        // Codigo de error...
      }
    });

He leido que esto puede bloquearte el navegador, pero si te funciona es que estas haciendo algo mal en las llamadas asincronas.

Espero que te 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