Foros del Web » Programando para Internet » Javascript »

return de una funcion

Estas en el tema de return de una funcion en el foro de Javascript en Foros del Web. Hola buenas quiero que suceda lo siguiente tengo una funcion dentro de otro y quiero que el retorno de la primero funcion sea el de ...
  #1 (permalink)  
Antiguo 22/08/2015, 20:42
Avatar de xlos_mas_pro  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago
Mensajes: 359
Antigüedad: 13 años
Puntos: 11
Pregunta return de una funcion

Hola buenas quiero que suceda lo siguiente tengo una funcion dentro de otro y quiero que
el retorno de la primero funcion sea el de la segundo ejemplo
Código Javascript:
Ver original
  1. function primera()
  2. {
  3.      function segundo()
  4.     {
  5.        var res = "algo";
  6.        return res;
  7.  
  8.     }
  9.     return res; // QUIERO PODER RETORNAR ESE res de la segunda funcion se puede hacer
  10. }
  11.  
  12. primera();
  #2 (permalink)  
Antiguo 22/08/2015, 20:47
Avatar de kspr  
Fecha de Ingreso: agosto-2011
Ubicación: Ecuador
Mensajes: 43
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: return de una funcion

que tal si retornas una funcion anonima?

Código Javascript:
Ver original
  1. function primera() {
  2.     return (function() {
  3.        var res = "algo";
  4.        return res;
  5.     }());
  6. }

en todo caso para que funcione tú código tendrías que llamar a "segunda" y definir la variable res en el contexto de la funcion primera
  #3 (permalink)  
Antiguo 22/08/2015, 20:50
Avatar de xlos_mas_pro  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago
Mensajes: 359
Antigüedad: 13 años
Puntos: 11
Respuesta: return de una funcion

lo que pasa es que es solo un ejemplo mi funcion primera es una prototype de una clase y la seguda es una funcion a base de datos que se ejecuta sola,

pero de todas meneras probare lo que me dices Gracias
este es el original
Código Javascript:
Ver original
  1. Model.prototype.comprobar = function (user, password)
  2.     {  
  3.  
  4.         var query = Database.instance.query('SELECT * FROM usuarios',function(err,rows){
  5.                    return rows;
  6.                 });
  7.         return rows;
  8.  
  9.  
  10.     }
  #4 (permalink)  
Antiguo 22/08/2015, 20:50
 
Fecha de Ingreso: enero-2013
Ubicación: Costa Rica
Mensajes: 6
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: return de una funcion

Tienes un error en el ambito(closures) de la variable res;
Debes crearla antes de la segunda funcion, para que la primera la reconozca..

Código Javascript:
Ver original
  1. function primera()
  2. {  
  3.     var res;
  4.      function segundo()
  5.     {
  6.        res = "algo"
  7.        return res;
  8.     }
  9.     return segundo();
  10. }
  11.  
  12. console.log(primera());
  #5 (permalink)  
Antiguo 22/08/2015, 21:18
Avatar de kspr  
Fecha de Ingreso: agosto-2011
Ubicación: Ecuador
Mensajes: 43
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: return de una funcion

si estamos hablando de una función asíncrona entonces necesitas valerte de eventos, javascript en su mayoría trabaja para eventos.

de modo que necesitas usar promesas o definir un callback y disparar el evento cuando tu consulta este lista.

Código Javascript:
Ver original
  1. Model.prototype.comprobar = function (user, password, callback)
  2. {  
  3.     var query;
  4.    
  5.     return Database.instance.query('SELECT * FROM usuarios',function(err,rows){
  6.        return callback(rows);
  7.     });
  8. }

tú código tiene toda la pinta de estar trabajando en el servidor, con que estas trabajando? nodejs?
  #6 (permalink)  
Antiguo 22/08/2015, 21:27
Avatar de xlos_mas_pro  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago
Mensajes: 359
Antigüedad: 13 años
Puntos: 11
Respuesta: return de una funcion

si con nodejs pero lo que hice fue separar en un modelo como lo llame al estilo mvc las consultas a la base de datos.

Probe tu codigo y dice callback is not a function en la linea de return callback(rows);
  #7 (permalink)  
Antiguo 22/08/2015, 21:32
Avatar de xlos_mas_pro  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago
Mensajes: 359
Antigüedad: 13 años
Puntos: 11
Respuesta: return de una funcion

el problema la verdad no es eso sino que no puedo retornar Database.instance ya que es un objecto gigante que no muestra la respuesta de la consulta lo ideal seria poder retornar estar funcion anonima que se ejecuta dentro esta funcion(err,rows) ponerle un return antes pero no se puede es por eso que no he podido lograr un retorno
  #8 (permalink)  
Antiguo 22/08/2015, 21:35
Avatar de kspr  
Fecha de Ingreso: agosto-2011
Ubicación: Ecuador
Mensajes: 43
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: return de una funcion

esto es por que no esta colocado de forma segura, a manera de solo darte un ejemplo.

Código Javascript:
Ver original
  1. Model.prototype.comprobar = function (user, password, onSuccess)
  2.     {  
  3.         Database.instance.query('SELECT * FROM usuarios',function(err, rows){
  4.             if (typeof onSuccess === 'function') {
  5.                 onSuccess.call(this, rows); // or onSuccess(rows);
  6.             }
  7.         });
  8.     }

entonces, al llamar a comprobar

Código Javascript:
Ver original
  1. Model.comprobar('user', '12345', function (rows) {
  2.      console.log(rows);
  3. });

---

La razon por la que no puedes retornar rows es por que Database.instance.query trabaja de forma asíncrona, de modo que retornaría un valor nulo en primera instancia y despues realizaría la consulta, la solución es trabajar por eventos, desconozco que framework estas usando, por lo que no podría darte opciones sobre la api de x framework.

Última edición por kspr; 22/08/2015 a las 21:43 Razón: detalle sobre la función asíncrona
  #9 (permalink)  
Antiguo 22/08/2015, 21:45
Avatar de xlos_mas_pro  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago
Mensajes: 359
Antigüedad: 13 años
Puntos: 11
Respuesta: return de una funcion

WOOOWWW SI FUNCIONO

Te lo agradezco de verdad me haz sacado varias horas de encima
aun no entiendo muy bien como funciona pero lo estudiare gracias

Agradecido :)
  #10 (permalink)  
Antiguo 23/08/2015, 00:05
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: return de una funcion

Otra forma de hacerlo es utilizando promesas, como acertadamente te lo aconsejó kspr.

Podrías establecer a tu método .comprobar() como estático y luego extenderlo, para que así puedas establecer otros métodos dentro de él que se ejecuten cuando se obtenga la respuesta del proceso asíncrono, tal y como lo hacen los método asíncronos de jQuery.

En esta parte, establecemos al método .comprobar() como estático, verificando que this sea una instancia del método Model.comprobar para que cuando queramos referirnos al método, lo hagamos mediante dicha palabra reservada. En otras palabras, this representará a Model.comprobar. También creo un atributo para Model.comprobar en el cual establezco la promesa.

Al final, retorno al mismo método para poder encadenar a los otros métodos.
Código Javascript:
Ver original
  1. Model.comprobar = function (user, password){
  2.     if (!(this instanceof Model.comprobar) return new Model.comprobar(user, password);
  3.     this.promesa = new Promise(function(ok, error){
  4.         Database.instance.query("SELECT * FROM usuarios", function(err, rows){
  5.             ok(rows);
  6.             error(err);
  7.         });
  8.     });
  9.     return this;
  10. };

No sé qué eventos o estados tendrá el método que utilizas. Por ejemplo, el objeto XMLHttpRequest (Ajax) tiene eventos como load, error, así como códigos de estado (200, 404), entonces, con una condición, se puede establecer qué función de la promesa ejecutar, si la del caso positivo o del negativo. Si sabes cómo comprobar que se produjo un error, sería bueno que añadas la respectiva condición.

Intuyendo por lo que veo, creo que puede quedar más o menos así:
Código Javascript:
Ver original
  1. Database.instance.query("SELECT * FROM usuarios", function(err, rows){
  2.     if (!err){
  3.         ok(rows);
  4.     }
  5.     else{
  6.         error(err);
  7.     }
  8. });

Ahora, extendemos al método Model.comprobar, creando dos métodos que se ejecutarán cuando se obtenga una respuesta del método Model.comprobar. Ambos reciben una llamada de retorno que no es otra cosa que una función anónima que el usuario personalizará a su conveniencia.
Código Javascript:
Ver original
  1. Model.comprobar.prototype = {
  2.     bien: function(callback){
  3.         this.promesa.then(function(respuesta){
  4.             callback(respuesta);
  5.         });
  6.         return this;
  7.     },
  8.     mal: function(callback){
  9.         this.promesa.catch(function(error){
  10.             callback(error);
  11.         });
  12.         return this;
  13.     }
  14. };

Y para ejecutar esto:
Código Javascript:
Ver original
  1. var comprueba = Model.comprobar("usuario", "clave");
  2.  
  3. comprueba.bien(function(respuesta){
  4.     console.log("La respuesta es: " + respuesta);
  5. });
  6.  
  7. comprueba.mal(function(error){
  8.     console.log("Se produjo un error: " + error);
  9. });

Que también puedes encadenar:
Código Javascript:
Ver original
  1. Model.comprobar("usuario", "clave")
  2.     .bien(function(respuesta){
  3.         console.log("La respuesta es: " + respuesta);
  4.     })
  5.     .mal(function(error){
  6.         console.log("Se produjo un error: " + error);
  7.     });

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 23/08/2015 a las 00:12 Razón: Más información

Etiquetas: funciones, js
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 21:59.