Cómo interceptar las llamadas AJAX de jQuery y simular la latencia
Desarrollando una demo de una aplicación web, me vi en la necesidad de interceptar las llamadas AJAX para poder simular la latencia, es decir, un tiempo en retardo que toman un conjunto de datos en viajar de un punto a otro.
Como estaba utilizando jQuery, me puse a investigar en la documentación para determinar si existe algún punto en común que preceda a todas las llamadas asincrónicas realizadas a través de $.ajax. Mi idea era realizar algo del siguiente modo.
Mi idea…
$.preAjax(function(argumentos) {
// Intercepto todas las llamadas AJAX
// y las ejecuto en un tiempo más tarde.
setTimeout(function() {
$.ajax.apply(this, argumentos);
}, Math.random() * 1000);
});
Como dije previamente, dicha función no existe. Entonces procedí a crear un código que me permita realizar lo anterior. ¿El resultado? A continuación.
El código
// Este objeto guardará los argumentos
// y las referencia a this.
var testAjax = {
args : {}, // argumentos
thiz : {}, // referencias a this
fn : {}, // donde se guardará la función original de $.ajax
// Interceptor de las llamadas AJAX.
ajax : function(uuid) {
var args = this.args[uuid], thiz = this.thiz[uuid];
delete this.args[uuid];
delete this.thiz[uuid];
this.fn.ajax.apply(thiz, args);
}
};
jQuery(document).ready(function($) {
// Guardo la función original de AJAX.
testAjax.fn.ajax = $.ajax;
// Sobrescribo la función original de AJAX.
$.ajax = function() {
// Generar único id.
var uuid = (new Date()).getTime();
// Guardar todos los argumentos originales.
testAjax.args[uuid] = arguments;
// Guardar la referencia original a this.
testAjax.thiz[uuid] = this;
// Generar delay variado de hasta 1000ms.
var delay = Math.random() * 1000;
// Ejecutar la función AJAX después del delay
setTimeout('testAjax.ajax(' + uuid + ')', delay);
};
});El código anterior permite que todas las llamadas AJAX utilizando jQuery sean retardadas aleatoriamente. Esto es sumamente útil a la hora de desarrollar una aplicación web donde no tenemos ninguna implementación server side y deseamos simular el comportamiento de la aplicación cuando se ejecute una llamada asincrónica.
En el futuro no muy lejano
- Agregar documentación
- Implementar plugin de jQuery




Hola!
Hace ya varios meses que uso jQuery (precisamente, empecé a interesarme cuando leí los cursos que tú mismo iniciaste en esta misma página) y desde entonces voy aprendiendo sobre este framework sobre la marcha.
El caso es que me ha llamado la atención que usaras un Timeout en lugar del método delay (http://api.jquery.com/delay/).
O tal vez haber usado el Timeout (o el delay) dentro de la función beforeSend de $.ajax.
De todas formas, como te he dicho más arriba, aún soy un principiante en jQuery (no llevo ni un año), así que no me sorprendería que me corrigieses
Un saludo y me alegro que hayas vuelto al blog
@Cole
Gracias por tu comentario. la función delay es bien práctica, sin embargo, esta es fue diseñada especialmente para los efectos de jQuery como “aparecer”, “desaparecer” entre otros. Por esa razón no había utilizado esta.
Por otro lado, en cuanto a beforeSend -si bien recuerdo- no me daba visibilidad a la funciones de callback para success y error.
Pero ya verás, he mejorado bastante el plugin. Estoy haciendo una demo para que pueda ser aprovechado por quienes lo necesitan.
Hey no estaría mal que dieras algunas técnicas en java eso sería muy interesante.
Ok Yonuery, lo tomaré en cuenta para la próxima. Gracias por tu comentario.
Hola que tal, escribo para saludarte y para comentarte que has abandonado mucho tu web,
ya no se ven los tutos.
Donde estas my friend?
Si estas desarrollando el lado server con php yo uso sleep(nSgudos) para simular la latencia.. solo que hay que recordar quitarlo cuando las pruebas terminen…