
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:
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??
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


0