Ver Mensaje Individual
  #10 (permalink)  
Antiguo 23/08/2015, 00:05
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años, 4 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