Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/10/2007, 19: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...

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==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() {
        var 
nombreFunc oThis.toString().substring"function ".lengthoThis.toString().indexOf("(") );
        
e("Comprobando: fin de "+nombreFunc+" es "+oThis.fin);
        if( 
oThis.fin == true ) {
            
oThis.reestablecerFin();
            
clearIntervaloThis.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.setDespuessegundona );
    
tardona.ejecutarDespuesAlFinalizar();
    
tardona();
    
// Hilvanemos tercerona
    
segundona.setDespuestercerona );
    
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.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.