Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<meta name="Author" content="derkeNuke" />
<title>Página nueva</title>
<style type="text/css">
</style>
</head>
<body>
<script type="text/javascript">
<!--
// 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() { // Cada 500ms comprobará si this ha terminado
var nombreFunc = oThis.toString().substring( "function ".length, oThis.toString().indexOf("(") );
e("Comprobando: fin de "+nombreFunc+" es "+oThis.fin);
if( oThis.fin == true ) {
oThis.reestablecerFin(); // Reestablecemos esta variable para el futuro
clearInterval( oThis.comprobarFin ); // Terminamos la comprobación redundante
oThis.despues(); // Aquí es donde ejecutamos la función de despues
}
}, 500);
}
// GUARDAR LOS PARÁMETROS DE UNA FUNCIÓN PARA EJECUTARLA DESPUÉS
Function.prototype.toClosure = function() {
var f = this;
var a = arguments;
return (function() {
return f.apply(this, a);
});
}
function funcionQueTarda(parametro) {
e("Entro en funcionQueTarda con el parámetro: "+parametro+".");
e("Tardaré en acabarme unos 5 segundos.");
// .... cosas que tardan
// el setTimeout es sólo para simular que la ejecución de tardona() tarda 5 sgs. Tú en tu función sólo tendrías que poner:
// funcionQueTarda.declararFin(); al final de esta función
setTimeout( function() {
funcionQueTarda.declararFin();
e("Fin de funcionQueTarda -- funcionQueTarda.declararFin() ejecutado");
} , 5000);
e("funcionQueTarda está ejecutándose, y está tardando .... ");
}
function procesarIteracion(parametro) {
e("Entro en procesarIteracion con el parámetro: "+parametro+".");
// Aquí dentro va todo lo que debería hacer el for normalmente
e("Acabo de procesar "+parametro+".");
// ProcesarIteración también se encarga de continuar la iteración si todavía no hubiésemos llegado a donde queríamos llegar
if( --parametro >= 0 ) { // Continuamos con la iteración, con parametro-1
forConPausas(parametro);
}
}
function forConPausas(valorI) {
//for(var i=5; i>=0; i--) {
var i=valorI; // Comenzamos el ciclo con la variable i con el valor inicial que tú quieras
e("Entro en la iteración de i: "+i+".");
funcionQueTarda.setDespues( procesarIteracion.toClosure(i) ); // Después de funcionQueTarda quiero procesarIteracion
funcionQueTarda(i); // Ejecución de la función en sí
funcionQueTarda.ejecutarDespuesAlFinalizar(); // Ésto sólo hace que ir comprobando para lanzar procesarIteracion después
e("Fin de la iteración de i: "+i+".");
//}
}
window.onload = forConPausas.toClosure(5);
// -->
</script>
</body>
</html>
Te he puesto tambien en
window.onload con un
toClosure para que veas su utilidad y quizás comprendas mejor...
Bueno, lo siento por la graaaan chapa. Es que es un tema complicado que siempre me ha llamado la atención. Espero encontrar algún día una forma más fácil de hacer todo ésto.
Un saludo.