Foros del Web » Programando para Internet » Javascript »

funcion con precallback y postcallback

Estas en el tema de funcion con precallback y postcallback en el foro de Javascript en Foros del Web. Hola.... otra vez por aca. tengo una funcion con la q cargo por medio de ajax una web, esta funcion entre sus parametros tiene precallback ...
  #1 (permalink)  
Antiguo 25/11/2008, 15:39
Avatar de killerangel  
Fecha de Ingreso: septiembre-2007
Ubicación: Un punto en el espacio
Mensajes: 592
Antigüedad: 16 años, 7 meses
Puntos: 10
funcion con precallback y postcallback

Hola....

otra vez por aca.

tengo una funcion con la q cargo por medio de ajax una web, esta funcion entre sus parametros tiene precallback y post callback que son dos funciones que se mandan como parametros y q son evaluadas para modificar algunos contenidos necesito algo asi:

Código:
function mifuncion(param,precallback,precallback){
 [sentencias0]...
 //si existe precallback se ejecuta: 
 if(precallback){precallback()}
 [sentencias1]...
 //si existe postcallback se ejecuta: 
 if(postcallback ){postcallback ()}
 [sentencias2]...
}

//va algo asi

mifuncion('nombre',function(){var x=1},function(){var y=2)})
el problema es q mientras se ejecuta precallback pareciera q en paralelo se ejecutan las [sentencias2] y lo q necesito es que si se ejecuta precallback no se haga nada hasta terminar

basicamente es q no se pase a otra linea mientras no se termine de ejecutar una funcion.

gracias!!
__________________
Sueñen... y trabajen por hacer esos sueños realidad... de eso se construye el futuro!!
Me siento entre la ASP-ada y la PHP-red
  #2 (permalink)  
Antiguo 25/11/2008, 15:49
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: funcion con precallback y postcallback

Habría que ver cómo estás usando eso. Para evitar esos problemas conviene llamar a todas las funciones cuando onreadystatechange==4, de esa manera todo se ejecuta línea a línea y sale como esperás. La alternativa puede ser compleja: colocar variables que cambien cuando las funciones se terminen de ejecutar, verificar con setInterval si esas variables cambiaron y recién ahí ejecutar el resto.
  #3 (permalink)  
Antiguo 25/11/2008, 16:22
Avatar de killerangel  
Fecha de Ingreso: septiembre-2007
Ubicación: Un punto en el espacio
Mensajes: 592
Antigüedad: 16 años, 7 meses
Puntos: 10
Respuesta: funcion con precallback y postcallback

veo veo... parece q la cosa no esta muy facil.... tendre q cambiar la forma y fondo del asunto.

gracias
__________________
Sueñen... y trabajen por hacer esos sueños realidad... de eso se construye el futuro!!
Me siento entre la ASP-ada y la PHP-red
  #4 (permalink)  
Antiguo 25/11/2008, 16:35
Avatar de killerangel  
Fecha de Ingreso: septiembre-2007
Ubicación: Un punto en el espacio
Mensajes: 592
Antigüedad: 16 años, 7 meses
Puntos: 10
Respuesta: funcion con precallback y postcallback

Aver me exlico mejor:

estoy cargando una web con ajax en un div oculto;

la primera funcion me sirve por si es q antes de mostrar el resultado le hago unos ajustes.
si se hace o no los ajustes dependiendo del caso con la funcion precallback y despues de eto se continua con otras sentencias.... ya despues se muestra el contenido y si hay un callback biene al final en esta parte

masomenos me dejo entender??
__________________
Sueñen... y trabajen por hacer esos sueños realidad... de eso se construye el futuro!!
Me siento entre la ASP-ada y la PHP-red
  #5 (permalink)  
Antiguo 25/11/2008, 16:47
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion con precallback y postcallback

Tal como está el código que has puesto, ocurre como esperas. El código se ejecuta secuencialmente. Hasta que no termine precallback() no se ejecuta la siguiente sentencia.

Código javascript:
Ver original
  1. var flag = 0;
  2. function mifuncion(param,hook){
  3.     alert("[1]: " + flag);
  4.     flag = param;
  5.     alert("[2]: " + flag);
  6.     if (hook) { hook(); }
  7.     alert("[3]: " + flag);
  8.     flag = param;
  9.     alert("[4]: " + flag);
  10. }
  11. mifuncion(3, function() { alert("[a]: " + flag); flag = 7; alert("[b]: " + flag);});
El resultado de los alerts es:
[1]: 0
[2]: 3
[a]: 3
[b]: 7
[3]: 7
[4]: 3
Es decir, en el orden correcto que cabía esperar.


De todos modos, con la llamada de ejemplo que has puesto, no hay ningún efecto secundario en las funciones que pasas como precallback y postcallback, así que en realidad no se ve el orden de ningún modo. Repito: con ese ejemplo.



Otra cosa distinta es que en las funciones que pasas como precallback y postcallback haya otro tipo de llamadas. Si, lo que tienes en ellas, por ejemplo son llamadas asíncronas con XHR o setTimeouts o algo similar, entonces a eso no se esperará que finalice (por definición). Pero ojo, a eso. Porque en realidad la llamada a precallback() sí que finalizará y se continuará en orden.

Quizá sería más conveniente que pusieras el código real para que podamos ver dónde está el problema.
  #6 (permalink)  
Antiguo 25/11/2008, 16:53
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: funcion con precallback y postcallback

A mi por lo menos no me queda muy claro, pero quizá te sirva este ejemplo para ver cómo disparar un callBack que contemple la respuesta ajax (aunque no sea exactamente lo que creo que necesites, puede darte alguna idea): http://www.forosdelweb.com/2542022-post7.html
Edito: Postée antes que venkman (hola!)
  #7 (permalink)  
Antiguo 25/11/2008, 17:04
Avatar de killerangel  
Fecha de Ingreso: septiembre-2007
Ubicación: Un punto en el espacio
Mensajes: 592
Antigüedad: 16 años, 7 meses
Puntos: 10
Respuesta: funcion con precallback y postcallback

PLUGIN JQUERY Q HACE PARA CARGAR CON EFECTO:(... o al menos eso trato de hacer :( ...)

1º el div original se desvanece y aparece tabla del mismo tamaño con una imagen de loading y un boton de 'Detener Carga'

2º una vez terminada la carga (q hago en un div oculto), efectua el precallback... por ejemplo si he cargado json y kiero manejar el resultado antes de mostrarlo.

3º redimensiono el div al tamaño del divo oculto, lo hago aparecer y elimino el actual y para q nadie sepa q paso le paso el id del div anterior al nuevo div

4º si hay un callback se efectua al final....

lo q esta como ofset y su metodo H es solo para calcular la altura del div oculto


Código javascript:
Ver original
  1. jQuery.fn.cp = function(url,data,precall,postcall){
  2.     this.each( function(){
  3.         if($(this).attr("title")=="x"){
  4.             return;
  5.         }
  6.         $(this).attr("title","x");
  7.         var im='<center><img id="il'+this.id+'" src="../images/loading.gif" alt="cargando" \/><br \/>'+
  8.         '<br \/><input type="button" value="Detener" id="btn'+this.id+'"\/><\/center>';
  9.         $(this).fadeOut("fast",function(){
  10.             var h=new ofset(); h=h.H(this.id);
  11.             $(this).html('<table width="100%" border="0" height="'+h+'" id="ttt"><tr><td valign="middle" id="td'+this.id+'">'+im+'<\/td><\/tr><\/table>');
  12.             $(this).show();
  13.             var conte=this;
  14.             $(this).before('<div id="d_aux'+this.id+'" style="display:none" ><\/div>');
  15.             $("#btn"+this.id).click(function(){
  16.                 res.abort();
  17.                 $(this).before("<span class='alerta'>Carga Detenida<\/span>");
  18.                 $("#"+this.id+",#il"+conte.id+",#d_aux"+conte.id).remove();
  19.                 $(conte).removeAttr("title");
  20.                 return false;
  21.             })
  22.             var res=$.ajax({
  23.                 type: "POST",
  24.                 cache: false,
  25.                 async: false,
  26.                 url: url,
  27.                 data: data,
  28.             }).responseText;
  29.             if(precall){res=precall(res);}
  30.             $("#d_aux"+this.id).html(res);
  31.             var h=new ofset(); h=h.H("d_aux"+this.id);
  32.             $("#td"+this.id).empty();
  33.             $(this).animate({height:h},"normal",function(){
  34.                 $("#d_aux"+conte.id).fadeIn("fast");
  35.                 $(this).remove();
  36.                 $("#d_aux"+conte.id).attr("id",conte.id);
  37.                 $(this).removeAttr("title")
  38.                 if(postcall){postcall()}
  39.             });
  40.         });
  41.     });
  42. }

__________________
Sueñen... y trabajen por hacer esos sueños realidad... de eso se construye el futuro!!
Me siento entre la ASP-ada y la PHP-red
  #8 (permalink)  
Antiguo 25/11/2008, 17:10
Avatar de killerangel  
Fecha de Ingreso: septiembre-2007
Ubicación: Un punto en el espacio
Mensajes: 592
Antigüedad: 16 años, 7 meses
Puntos: 10
Respuesta: funcion con precallback y postcallback

masomenos funciona asi:

Código:
$("#mi_div").cp("lista_usuarios.php",{pais:1},
	function(res){
		//hago una tabla con los datos q he obtenido por json q es la respuesta de la web q cargo
		//y obiamente retorno la tabla lista...
		//... sentencias ...
	},
	function(){
		//esto para rellenar a q se nota el post callback
		alert('tarea terminada :) ')
	alert
	}
)
__________________
Sueñen... y trabajen por hacer esos sueños realidad... de eso se construye el futuro!!
Me siento entre la ASP-ada y la PHP-red
  #9 (permalink)  
Antiguo 25/11/2008, 17:12
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion con precallback y postcallback

Esa llamada síncrona que tienes ahí (res)... ¿Estás probando esto con Firefox?
  #10 (permalink)  
Antiguo 25/11/2008, 17:16
Avatar de killerangel  
Fecha de Ingreso: septiembre-2007
Ubicación: Un punto en el espacio
Mensajes: 592
Antigüedad: 16 años, 7 meses
Puntos: 10
Respuesta: funcion con precallback y postcallback

sip solo uso ff

me acabo de percatar q con ie no corre :(
__________________
Sueñen... y trabajen por hacer esos sueños realidad... de eso se construye el futuro!!
Me siento entre la ASP-ada y la PHP-red
  #11 (permalink)  
Antiguo 25/11/2008, 17:27
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion con precallback y postcallback

Bueno, ahora me voy ya a dormir, pero... ahora mismo lo que se me ocurre es que deberías evitar completamente el uso de esa llamada síncrona y hacerla asíncrona.
  #12 (permalink)  
Antiguo 26/11/2008, 04:09
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: funcion con precallback y postcallback

Bueno... He estado mirando el código con más detalle y se me ha ocurrido alguna cosa más.

Claramente hay que eliminar la llamada síncrona como sea. Además, ¿has probado lo de cancelar? ¿Funciona bien?
Lo digo porque puede que funcione, pero es un comportamiento en el que no deberías confiar. Si la petición es síncrona, el código se debe parar ahí hasta que se recibe la respuesta. Aunque se genere por otro lado el evento que mande el abort(), el navegador no tiene un modo limpio de terminar la petición y continuar la ejecución del código, pero tampoco tiene un modo limpio de parar la ejecución del resto del código. Con una petición asíncrona, basta eliminar la petición. Se desconecta, no llega respuesta, nunca salta el evento readystatechange (*) y no hay ningún problema.

(*) En realidad sí salta, porque se resetea a 0. Pero bueno, ese ya es otro asunto.

Bueno, a lo que iba. Creo que habría que hacer algo más o menos así:

Código javascript:
Ver original
  1. jQuery.fn.cp = function(url,data,precall,postcall){
  2.     this.each( function(){
  3.         if($(this).attr("title")=="x"){
  4.             return;
  5.         }
  6.         $(this).attr("title","x");
  7.         var im='<center><img id="il'+this.id+'" src="../images/loading.gif" alt="cargando" \/><br \/>'+
  8.                     '<br \/><input type="button" value="Detener" id="btn'+this.id+'"\/><\/center>';
  9.         $(this).fadeOut("fast",function(){
  10.             var h=new ofset(); h=h.H(this.id);
  11.             $(this).html('<table width="100%" border="0" height="'+h+'" id="ttt"><tr><td valign="middle" id="td'+this.id+'">'+im+'<\/td><\/tr><\/table>');
  12.             $(this).show();
  13.             var conte=this;
  14.             $(this).before('<div id="d_aux'+this.id+'" style="display:none" ><\/div>');
  15.             var res;
  16.             $("#btn"+this.id).click(function(){
  17.                 res.onreadystatechange = function() {};
  18.                 res.abort();
  19.                 $(this).before("<span class='alerta'>Carga Detenida<\/span>");
  20.                 $("#"+this.id+",#il"+conte.id+",#d_aux"+conte.id).remove();
  21.                 $(conte).removeAttr("title");
  22.                 return false;
  23.             });
  24.             res=$.ajax({
  25.                 type: "POST",
  26.                 cache: false,
  27.                 async: true,
  28.                 url: url,
  29.                 data: data,
  30.                 success: function(res) {
  31.                     if(precall){res=precall(res);}
  32.                     $("#d_aux"+this.id).html(res);
  33.                     var h=new ofset(); h=h.H("d_aux"+this.id);
  34.                     $("#td"+this.id).empty();
  35.                     $(this).animate({height:h},"normal",function(){
  36.                         $("#d_aux"+conte.id).fadeIn("fast");
  37.                         $(this).remove();
  38.                         $("#d_aux"+conte.id).attr("id",conte.id);
  39.                         $(this).removeAttr("title")
  40.                         if(postcall){postcall()}
  41.                     });
  42.                 }
  43.             });
  44.         });
  45.     });
  46. }

Lo he puesto un poco deprisa y habría que revisarlo y probarlo, claro. Miralo tú un poco por esta parte, ok?

Ah, otra cosa... los nombre "precallback" y "postcallback" a mi personalmente no me quedan muy claros porque en realidad se llaman los dos después de la petición XHR, ¿no? Quizá sería mejor ponerles nombres como... "processDataCallback" y... no sé, "finalizeCallback" o alguna cosa similar.

Última edición por venkman; 26/11/2008 a las 04:16
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 11:20.