PDA

Ver la Versión Completa : Ejecutar función de JavaScript a partir del nombre de su identificador (string)


dec
23-08-2006, 14:00:31
Hola,

Estoy tratando de organizarme mejor cuando utilizo el objeto "XmlHttpRequest". Resulta que quisiera "abstraer" la petición HTTP de lo que ha de hacerse con el resultado de esta. Así me gustaría contar con una función (o una clase, pero, esto ya se verá más adelante) que se encargara sólo de realizar la petición HTTP mediante el objeto mencionado.

A la función (o método de la clase) le pasaría varios parámetros, conviene a saber: el método de la petición HTTP, la URL a la que enviar le petición, los pares de variables/valor correspondientes, y... y aquí está la madre del cordero, el nombre de una función que hiciera a modo de "callback" y a la que la función encargada de la petición HTTP llamaría a su vez cuando esta se completara, por ejemplo.

Ya he hecho varias pruebas al respecto, y, lo primero que me pregunté es cómo podía ejecutar una función en JavaScritp a partir del nombre de su identificador disponible en una variable de tipo string, claro. Esto me consta que puede hacerse, pero, lo vi vaya usted saber dónde y además buscando por Internet no he conseguido nada que me sacara del apuro...

El caso es que he llegado a poder ejecutar la función de este modo:


function PeticionHttp('get', 'http://url', 'variable=valor', 'FuncionCallBack')
{
// Omitimos el resto del código

eval(FuncionCallBack +'()'+);

// Omitimos el resto del código
}


Es decir, he conseguido ejecutar la función utilizando a su vez la función "eval" de JavaScript, peeeeeeeeeeeero... ;)

A dicha función "CallBack" tengo que pasarle unos parámetros... un par de ellos, y, aunque esto es posible usando "eval" para ejecutar la función, lo cierto es que uno de ellos me causaba problemas, porque se trata de no poco código HTML lo que contiene, y eso son muchas comillas dobles, simples, barras invertidas, sin invertir...

Errores, en definitiva, relativos a que el parámetro no llegaba en condiciones de ser utilizado. ¡Pero amigo! Como estaba acercándome al objetivo me dije, hombre, David, ya que pasas un parámetro pásalo bien... ¿porqué no pasas la instancia del objeto "XmlHttpRequest" y a partir de ahí le sacas el jugo que necesites desde la función "CallBack" correspondiente?

Ajá. Mi gozo en un pozo. No he conseguido pasar el objeto susomentado a la función "CallBack". ¡Y el caso es que llega "algo" del mismo, incluso da la impresión de que ahí está, porque lo que un "alert" reza sobre el parámetro de la función "CallBack" es el tipo del objeto que estamos pasando como parámetro! Pero ninguna de sus propiedades parece estar disponible, todas están "undefined".

Y digo yo si no habrá otra forma de ejecutar una función como lo preciso usando otra cosa que no sea la función "eval" de JavaScript. O si alguno de vosotros se ha topado con algún problema similar a este y recuerda algo que pueda echarme una mano. No corre ninguna prisa, por cierto. ;)

Bueno. Si necesitáis más información no dudéis en hacérmelo saber. Gracias a todos de antemano y que paséis un buen día. ;)

Para Román: me parece que alguna vez tratamos sobre el objeto "XmlHttpRequest" en el Foro de moderadores y tú preparaste cierto código que, desafortunadamente no he podido encontrar (y es raro, porque suelo guardar este tipo de información). Creo recordar incluso que algo tenía que ver con lo que quiero hacer, en cuanto a que usabas en el mismo alguna función a modo de "CallBack"). Por favor, Román, si lo encuentras por ahí y crees que tiene que ver sé tan amable de copiarlo por aquí. ¡Gracias! ;)

Posdatas: No sé si en JavaScript se podrán pasar parámetros por referencia. Por otro lado viendo que era posible que tuviera algo que ver que la función que hace la petición HTTP declarara como local la variable que contiene la instancia del objeto "XmlHttpRequest", traté de declarar esa variable como global, pero, ni por esas, la cosa no terminaba bien tampoco. ;)

roman
23-08-2006, 18:58:22
La verda es que me es difícil seguir el hilo y al final no nos dices cómo estás pasando el parámetro.

Aquí te pongo un ejemplo que me funciona:


/*
crea un objeto HttpRequest
*/
function createRequest()
{
// no implementada, simplemente debe crear
// el objeto según el navegador que se use
}

/*
manda una petición HTTP via ajax

recibe una función "callback" que se llamará en cuanto se
tenga respuesta. La función callback recibe como parámetro
al objeto HTTPRequest.
*/
peticionHttp(url, callBack)
{
// creamos el objeto HTTPRequest
request = createRequest();

// le asignamos el manejador de eventos
request.onreadystatechange = function()
{
// si todo está bien y muy bien...
if (request.readyState == 4 && request.status == 200)
{
// llamamos de vuelta
eval(callBack + '(request)');
}
}

// enviamos la petición
request.open('get', url, true);
request.send();
}


Un ejemplo de uso:


/*
ejemplo simplón de callback.
simplemente muestra la respuesta de la petición
*/
function procesaRespuesta(request)
{
alert(request.responseText);
}

/*
Lanzamos la petición
*/
peticionHttp('http://servidor/pagina.php', 'procesaRespuesta');


// Saludos

dec
23-08-2006, 23:04:17
Hola,

Gracias por responder Román. ;)


La verda es que me es difícil seguir el hilo y al final no nos dices cómo estás pasando el parámetro.


No me extraña, lo escribí ayer a última hora de la... mañana, luego de la tarde y noche y madrugada sin dormir, liado con Loturak, ya sabes (*). ;)

No puedo deciros cómo paso el parámetro de marras, porque, efectivamente, no he conseguido hacerlo, así que, de momento, hacemos las cosas no como querríamos, sino como nos es posible...

Una cosa sí puedo decir, y es que tengo que hacer más pruebas y las haré, porque, ¿lo que tú has escrito arriba funciona? Haces uso de la función "eval" y pasas el objeto "XmlHttpRequest" como parámetro, pero, ¿comprobaste que funciona?

Lo digo porque, eso, entre otras cosas, es lo que yo intenté, pero, es lo que digo arriba, que se recibe, aparentemente, el objeto pasado como parámetro, ¡pero sus propiedades son "undefined"! Así que, ¿probaste el código anterior o sólo intuyes que funcionará?

En todo caso gracias por responder Román. Veo que acaso no exista otra forma de hacer esto que con "val", en JavaScript.... bueno. Como sea habría que apañarse. ;)


(*) En realidad no hay excusa que valga. ;)

roman
23-08-2006, 23:07:55
¿lo que tú has escrito arriba funciona? Haces uso de la función "eval" y pasas el objeto "XmlHttpRequest" como parámetro, pero, ¿comprobaste que funciona?


Por supuesto. No acostumbro publicar código de más de dos líneas que no haya probado antes.

Agrego:

Justamente en la función "callback" de prueba usé request.responseText en lugar de simplemente request, para que no quedara duda.

// Saludos

dec
23-08-2006, 23:22:04
Hola,

Bueno... Pues entonces tendré que prestar atención y comprobarlo de nuevo. Voy a hacerlo esta vez fuera del proyecto, por separado, para ver si así las cosas se me presentan más claras. Dices que funciona... y te creo, ¡y a mí que me parecía hasta sintácticamente incorrecto! Por ejemplo, cuando haces esto:


eval(callBack + '(request)');


¿No se están mezclando churras con merinas? ¿No está ahí mezclándose una cadena (los paréntesis) y el identificador del objeto "request"? Yo puedo jurar que hize algo muy similar y no me funcionó, como he dicho, pero, en fin, te agradezco tu respuesta Román. Voy a tratar de intentar de nuevo a ver, que seguro que ahora va bien. ;)

roman
23-08-2006, 23:35:46
Eso similar que hiciste es difícil saber qué fue. En la declaración de la función PeticionHttp, ¿te has fijado como has declarado los parámetros?.

En cuanto a la sintaxis, callBack es una cadena, al igual que '(request)', así que el parámetro que se le pasa a eval es la cadena

'procesaRespuesta(request)'

JS no es PHP, no hay- que yo sepa -evaluación de variables dentro de una cadena.

Ahora, yo probé el código en IE y te aseguro que funciona. Por lo que dices, me he puesto a probar en FF y no funciona pero, bueno, en FF no funcionan muchas cosas.

// Saludos

dec
23-08-2006, 23:42:38
Hola,

¡Estupendo! ¡Comprobado y alucinado de su funcionamiento y posibilidades! ;)

Ahora bien, se ve que tengo que aprender sobre la función "eval" de JavaScript. Yo creo que aquí es donde estaba metiendo la pata, puesto que algo como lo que escribiste funciona:


eval(callbackfunc+'(request)');


Pero, yo estaba empeñado en hacer algo similar a esto:


eval(callbackfunc+'('+request+')');


Y bueno, algunas otras cosas más intenté, pero, ninguna con el éxito que ahora he tenido al hacerlo como dices. Muchas gracias otra vez Román. Ahora se ve que puedo ir pensando en cómo llevar a cabo el asunto, puesto que parece posible y hacedero. Gracias otra vez. :)

PD. Lo probé en FireFox, por cierto. ;)

roman
23-08-2006, 23:51:42
Curioso, yo lo he hecho funcionar en FF pero sólo pasando null al método request.send().

Si tú haces callbackfunc + '(' + request + ')', eso sí que son churros con merinas (¿qué son merinas?): estás sumando cadenas de caracteres con objetos.

Pero si esto te confunde, ¿qué tal si te digo que también funciona si pones:


eval(callBack(request));


así, sin comillas, pero llamando a la función también sin comillas:


peticionHttp('http://servidor/pagina.php', procesaRespuesta);


// Saludos

dec
24-08-2006, 00:02:01
Hola,


Curioso, yo lo he hecho funcionar en FF pero sólo pasando null al método request.send().


Te refieres a cuando se hace uso del método "GET" en la petición HTTP... pues no sé qué decirte, acabo de probarlo, por curiosidad, y en FireFox 1.5 funciona bien de ambos modos: con null y sin null. ;)


Si tú haces callbackfunc + '(' + request + ')', eso sí que son churros con merinas (¿qué son merinas?): estás sumando cadenas de caracteres con objetos.


Desde luego, no es que tuviera que haberlo supuesto, es que si hubiera mirado en la documentación de JavaScript sobre la función "eval" creo que hubiera dado con el asunto, pero, desafortunadamente para mí, JavaScript lo tengo un poco abandonado... peor para mí, ya digo.

Respecto de la no necesidad de utilizar las benditas comillas... ¡es estupendo! Porque te quitas de los líos que pueden suponer y el código fuente queda bastante más legible y serio, me parece a mí. Gracias de nuevo Román (estoy seguro de que estaré picando código un buen rato antes de que se me ocurra pasar por la documentación de JavaScript,... si es que...)... ;)

PD. Churras (http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=churra) y merinas (http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=merina). ;)

seoane
24-08-2006, 00:02:35
eso sí que son churros con merinas (¿qué son merinas?)


Las churras y las merinas son dos razas de ovejas distintas, de hay la expresión "mezclar churras con merinas"

roman
24-08-2006, 00:07:15
Ja, ja, ja. Yo leí churro (http://mexico.udg.mx/cocina/panaderia/churros.html)

:D

kayetano
24-08-2006, 01:27:04
Hola

Mira por donde he encontrado una web muy chula sobre el tema:
http://www.challenger.se
puedes sacar alguna idea del script que utiliza
http://www.challenger.se/include/js/xdbc.js

dec
24-08-2006, 01:30:45
Hola,


Mira por donde he encontrado una web muy chula sobre el tema:


Gracias Kayetano. :)