Ver Mensaje Individual
  #8 (permalink)  
Antiguo 15/10/2007, 10:34
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: como controlar la ejecucion...

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&#225;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==undefinedq="";
    if(!
sinBRq+="<br/>";
    
elDIV.innerHTML q;
    for(var 
a=0elDIV.childNodes.length>aa++) {
        
document.body.appendChildelDIV.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 ".lengthoThis.toString().indexOf("(") );
        
e("Comprobando: fin de "+nombreFunc+" es "+oThis.fin);
        if( 
oThis.fin == true ) {
            
oThis.reestablecerFin();                // Reestablecemos esta variable para el futuro
            
clearIntervaloThis.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 
this;
    var 
arguments;
    return (function() {
        return 
f.apply(thisa);
    });
}


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 >= ) {        // 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.setDespuesprocesarIteracion.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.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.