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

6 comentarios

  1. Cole

    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

  2. Rubens Mariuzzo

    @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.

  3. Blooglery

    Hey no estaría mal que dieras algunas técnicas en java eso sería muy interesante.

  4. Rubens Mariuzzo

    Ok Yonuery, lo tomaré en cuenta para la próxima. Gracias por tu comentario.

  5. Jesus Gabriel Vasquez Sanchez

    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?

  6. FcoDiaz

    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…

Deja un comentario

*
*