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 originalModel.comprobar = function (user, password){
if (!(this instanceof Model.comprobar) return new Model.comprobar(user, password);
this.promesa = new Promise(function(ok, error){
Database.instance.query("SELECT * FROM usuarios", function(err, rows){
ok(rows);
error(err);
});
});
return this;
};
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 originalDatabase.instance.query("SELECT * FROM usuarios", function(err, rows){
if (!err){
ok(rows);
}
else{
error(err);
}
});
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 originalModel.comprobar.prototype = {
bien: function(callback){
this.promesa.then(function(respuesta){
callback(respuesta);
});
return this;
},
mal: function(callback){
this.promesa.catch(function(error){
callback(error);
});
return this;
}
};
Y para ejecutar esto:
Código Javascript
:
Ver originalvar comprueba = Model.comprobar("usuario", "clave");
comprueba.bien(function(respuesta){
console.log("La respuesta es: " + respuesta);
});
comprueba.mal(function(error){
console.log("Se produjo un error: " + error);
});
Que también puedes encadenar:
Código Javascript
:
Ver originalModel.comprobar("usuario", "clave")
.bien(function(respuesta){
console.log("La respuesta es: " + respuesta);
})
.mal(function(error){
console.log("Se produjo un error: " + error);
});
Saludos