Oye, que me comía la curiosidad y lo he hecho más global, pudiendo hilvanar varias funciones sin problemas, gracias al prototipado:
Código PHP:
// escribir en el documento una ristra (x)html fuera de tiempo de ejecución.
function e(q,sinBR) {
var elDIV = document.createElement("DIV");
if(q==undefined) q="";
if(!sinBR) q+="<br/>";
elDIV.innerHTML = q;
for(var a=0; elDIV.childNodes.length>a; a++) {
document.body.appendChild( elDIV.childNodes[a].cloneNode(true) );
}
}
// FUNCIONES PROTOTIPADAS NECESARIAS PARA PODER ESPERAR Y EJECUTAR DESPUÉS DE UNA FUNCIÓN OTRA
Function.prototype.setDespues = function(f) { this.despues = f; }
Function.prototype.declararFin = function() { this.fin = true; }
Function.prototype.reestablecerFin = function() { this.fin = false; }
Function.prototype.ejecutarDespuesAlFinalizar = function() {
var oThis = this; // Para que funcione dentro del setInterval
this.comprobarFin = setInterval( function() {
var nombreFunc = oThis.toString().substring( "function ".length, oThis.toString().indexOf("(") );
e("Comprobando: fin de "+nombreFunc+" es "+oThis.fin);
if( oThis.fin == true ) {
oThis.reestablecerFin();
clearInterval( oThis.comprobarFin );
oThis.despues();
}
}, 500);
}
function tardona() {
e("Entro en tardona");
// .... cosas que tardan
// el setTimeout es sólo para simular que la ejecución de tardona() tarda 5 sgs
setTimeout( function() {
tardona.declararFin();
e("tardona.declararFin() ejecutado");
} , 5000);
}
function segundona() {
e("Entro en segundona!");
// .... cosas que tardan
// el setTimeout es sólo para simular que la ejecución de segundona() tarda 5 sgs
setTimeout( function() {
segundona.declararFin();
e("segundona.declararFin() ejecutado");
} , 5000);
}
function tercerona() {
e("Entro en tercerona!");
}
function principal() {
// Primer bloque
tardona.setDespues( segundona );
tardona.ejecutarDespuesAlFinalizar();
tardona();
// Hilvanemos tercerona
segundona.setDespues( tercerona );
segundona.ejecutarDespuesAlFinalizar();
}
window.onload = principal;
Como ves en
principal(), primero le decimos que después de
tardona() queremos ejecutar
segundona(). Luego iniciamos la comprobación para ver si ha terminado
tardona() para empezar su después (
segundona()), y ya por fin arrancamos
tardona().
Lo que ocurre es que se ejecuta
tardona(), y cuando llega a su fin entonces cambia el estado de
tardona.fin (pasando a ser true). Éste cambio es detectado por el setInterval comprobador dentro de
tardona.ejecutarDespuesAlFinalizar(); entonces hace saltar
tardona.despues que coincide con
segundona().
A segundona le hemos dicho que le preceda
tardona().
Y como ves todo funciona al parecer como debe.
Un saludo.