Ver Mensaje Individual
  #7 (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...

Hola de nuevo zyon:

Veo que no has captado muy bien el concepto de mi código. Lo que tú esperas que haga es una especid de sleep() de php, o algo como espera aqui hasta que verificaRelacionFlujo(s_val) acabe.

Bueno, lo que pasa es que mi código es algo diferente. Mi código va por funciones. Es decir: Ejecuto funcion1, y cuando haya acabado ejecuto funcion2, y cuando ésta haya acabado ejecuto funcion3... es decir, en ningún momento paro la ejecución, sólo espero para llamar a la siguiente función.

En tu caso, no hay funciones separadas. Tú quieres que dentro de un for, se detenga la ejecución. Eso, de momento y en la versión 1.5 de javascript es imposible (aunque lo estoy investigando vivamente, tal vez veais un post mio próximamente. He visto que en 1.7 sí se puede hacer).

Te digo lo que yo haría en tu caso (como es lógico vas a necesitar más código). Una primera idea podría ser:
Código PHP:
function forConPausas() {
    for(var 
i=10i>=0i--) {
        
funcionQueTarda(i);
        
// esperamos a que acabe funcionQueTarda... para ejecutar la siguiente sentencia
        
procesarIteracion(i);
    }

Algo así. Pero vemos que, por la naturaleza del for, lo que haría es lanzar un funcionQueTarda(10), y después, terminaría la iteración, y sin esperar a nada, ejecutaría un funcionQueTarda(9). Ésto nos genera un problema, porque que yo sepa no hay manera de parar un for momentáneamente, de hacerle una pausa. Así que vamos a tener que utilizar otro sistema:
Código PHP:
function forConPausas() {
    
//for(var i=5; i>=0; i--) {
    
var i=5;        // Comenzamos el ciclo con la variable i con el valor inicial que tú quieras
    
e("Entro en la iteración de i: "+i+".");
    
funcionQueTarda(i);
    
procesarIteracion(i);
    
e("Fin de la iteración de i: "+i+".");
    
//}

Así puesto, no itera. Pero aquí procesarIteracion se encargaría de continuar el for (es decir, volver a llamar a funcionQueTarda(i-1)) en caso de que i>=0. Mejor ponemos que forConPausas() se dedique a hacer una iteración con el parámetro que le pasemos:
Código PHP:
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
    // ....
    // ....

Entonces, ¿cómo demoramos procesarIteracion(i) hasta que funcionQueTarda(i) acabe? Bueno, creo que tenemos que entender un par de conceptos. Ojo que viene parte complicada, y te digo por qué. Con mi código escribiríamos ésto así:
Código PHP:
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 );        // 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+".");
    
//}

Pero algo falla. ¿Qué hay de los parámetros para procesarIteración? Los necesitamos, así que habrá que ponerlos. Voy a tener que darte una explicación rápida porque no sé si sabes ésto:

Hacer ésto es fácil:
Código PHP:
function alertar() {
    
alert("hola");
}
function 
ejecutador(funcion) {
    
funcion();
}
ejecutadoralertar ); 
ejecutador ejecuta la función que se le pase por parámetro. Muy bien si dicha función (alertar) no tiene parámetros ella. Pero si tiene parámetros no podemos hacer:
Código PHP:
function alertar(q) {
    
alert(q);
}
function 
ejecutador(funcion) {
    
funcion();
}
ejecutadoralertar("hola") ); 
Porque lo que estamos haciendo es primero ejecutar alertar("hola") y luego pasarle a ejecutador el resultado de esa sentencia anterior (undefined) así que falla. Lo que hay que hacer es un closure o almacenar los parámetros:
Código PHP:
function alertar(q) {
    
alert(q);
}
function 
ejecutador(funcion) {
    
funcion();
}

function 
alertarHola() {
    
alertar("hola");
}
ejecutadoralertarHola ); 
Vale, muy bien me dirás, pero no voy a almacenar los infinitos parámetros de esta forma tan poco automática. Se ha inventado un método para las funciones, un toClosure() que lo hace automáticamente:
Código PHP:
Function.prototype.toClosure = function() {
    var 
this;
    var 
arguments;
    return (function() {
        return 
f.apply(thisa);
    });
}
var 
alertarHola alertar.toClosure("hola"); 
Ahora la variable alertarHola contiene el mismo contenido que el anterior ejemplo. Pero es más cómodo:
Código PHP:
Function.prototype.toClosure = function() {
    var 
this;
    var 
arguments;
    return (function() {
        return 
f.apply(thisa);
    });
}

function 
alertar(q) { alert(q); }
function 
ejecutador(funcion) { funcion(); }

ejecutadoralertar.toClosure("hola") ); 
Bueno visto ésto de los closures o almacenamientos de los parámetros metámonos en harina. Hemos dicho que la primera ejecución es fácil. Se transcribiría en mi código así de limpio:
Código PHP:
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+".");
    
//}

Y luego dentro de procesarIteracion veríamos si tenemos que seguir "iterando" o no. procesarIteracion podría ser algo así:
Código PHP:
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);
    }



Te dejo un ejemplo completo que he comprobado que funciona. Tiene bastante contenido, pero como ya hemos visto el bloque que hace ejecutar una función después de otra, y el toClosure, y la función principal forConPausas y la iterativa procesarIteracion, creo que no te será duro entenderlo. Eso sí, leyendo poco a poco

EDIT: Me he pasado escribiendo: 10627 caracteres. Así que te posteo el código en el siguiente mensaje
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.