XMLHttpRequest – Uma abordagem diferente

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);
}
};