Vamos declarar nosso namespace:
var base = base || {};
base.utils = base.utils || {};
Vamos definir o que significa um objeto Request :
base.utils.Request = function(options) {
var self = this,
response = null;
Usando o argumento options , podemos mapear algumas propriedades iniciais:
this.method = options.method || 'GET';
this.URI = options.url;
this.type = options.type;
this.async = !(options.async === false);
this.data = null;
if (options.data != undefined && typeof options.data === 'object') {
this.data = options.data;
}
Vamos criar uma instância de XMLHttpRequest :
this.xhr = new XMLHttpRequest();
if (this.type != undefined) {
this.xhr.responseType = this.type;
}
Aqui vem a parte complicada. Em vez de escrever uma série de condicionais ( instruções if ), podemos mapear funções de retorno de chamada para cada Código de status HTTP :
this.callbacks = {};
this.callbacks[404] = options.notFound || null;
this.callbacks[200] = options.success || null;
Agora, tudo o que precisamos fazer é disparar a função de retorno de chamada correta :
this.xhr.onreadystatechange = function(event) {
if (this.readyState == 4) {
response = this.response || null;
self.callbacks[this.status] instanceof Function && self.callbacks[this.status].apply(self, [response]);
}
}
Pode ser uma boa ideia ter outra função de retorno de chamada no caso de ocorrer um erro de rede:
this.xhr.onerror = function() {
options.failure instanceof Function && options.failure.apply(this);
}
};