Funciones y ejecución diferida

Los desarrolladores que hayan usado Prototype (o ExtCore) habrán visto el método defer (en ambas librerías extendiendo al prototipo del object Function), que simplificado podría ser algo como:

// Ejecuta la funcion de manera diferida
Function.prototype.defer = function() {
	setTimeout(this, 0);
};

El objetivo de esta función (o método en caso que se extienda el prototipo, como en el ejemplo)  es diferir su ejecución hasta que el intéprete JavaScript esté libre.
La idea no es demasiado compleja ya que parte del funcionamiento básico del setTimeout, mediante el cual se programan funciones para ejecutarse en un tiempo futuro, en el cual obviamente, el inteprete debe estar disponible, caso contrario se pospondrá la ejecución hasta que ésta última condición se cumpla.

var who = 'Ajmed';

function whois() {
	alert(who);
}

whois.defer(); // ...

who = 'Ajmed: i keel you';

// 'Ajmed: i keel you'

Combinando con el uso de chain podemos lograr resultados un poco más complejos:

// Alert diferido
function deferredAlert() {
	// variable privada
    var values = [];

	// core del metodo
    setTimeout(function() {
        alert(values.join(", "));
    }, 0);

	// proxy
    return {
        addVal: function(v) {
            values.push(v);
            return this;
        }
    }
}

Ejemplos

deferredAlert()
    .addVal(1) // inteprete ocupado..
    .addVal(2) // tururu...
    .addVal(3); // turur....

// El inteprete libero el stack, por lo que se ejecuta
// el alert diferido -> 1, 2, 3

De igual manera pueden realizarse tareas más complejas, como iterar y generar resultados:

function getChar(i) {
    return String.fromCharCode(i)
}

var futureAlert = deferredAlert();

for(var i = 0; i < 10; i++) {
    futureAlert.addVal( getChar(i+100));
}

// el inteprete se libera -> d, e, f, g, h, i, j, k, l, m

Leer más:



Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Comment

You may use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>