2012-04-21 18 views
8

Me refiero a this. Todo aún no está claro.Javascript setTimeout detiene la ejecución de otro script

  • Tengo una función JS fillTree() que actualiza un árbol, tiene casillas de verificación.
  • Tengo otra función checkSelectedBoxes() que se ejecuta en window.onload que marca las casillas de verificación seleccionadas.
  • Ahora hay muchas otras funciones conectadas.

Mi pregunta:

  • Si estoy utilizando setTimeout() será la otra función script también parar y esperar a que mi función termine de cargar?

¿Cuál podría ser el caso en este:

function fillTree(){...} 
function checkSelectedBoxes(){...} 

fillTree(); // This take time to get data. onLoad() doesnt work. 
setTimeout(function(){ checkSelectedBoxes() },5000); 

Esto devuelve valores nulos me incluso después de aumentar el intervalo de tiempo. ¿fillTree() pausa la ejecución?

+0

No, 'setTimeout' no detiene la ejecución de otro código. Si intenta llamar a 'checkSelectedBoxes()' al completar 'fillTree()', ¿por qué no pasarlo como un parámetro de devolución de llamada, o simplemente al final de 'fillTree()'? –

+0

@RoryMcCrossan gracias, su respuesta parece la mejor solución posible, pero es un CMS que estoy usando y el árbol está configurado en otro archivo js con el que no interfiero, ya que se usa muchas otras funciones y los casos pueden no ser siempre el mismo –

Respuesta

9

No, setTimeout no lo espera (por lo tanto, JS no tiene función de pausa). Lo que hace setTimeout es dejar de lado esa tarea en un momento posterior y permitir que se ejecute la siguiente línea. cuando se alcanza ese tiempo de espera , inserta esa tarea en la línea de ejecución. y cuando no se está ejecutando ningún otro código, ejecuta la función que se indicó.

lo que quiere hacer es dar una devolución de llamada a su fillTree() y ejecutarlo cuando haya terminado.

function fillTree(callback){ 

    //do something very long 

    callback(); //execute passed function when it's done 
} 

fillTree(function(){ 
    checkSelectedBoxes(); //executes only when fillTree finishes 
}) 
+0

Gracias. Eso borró todo. Aceptaré en 8 minutos: P. Además, la pregunta no lo dice, pero ¿podría aconsejarme sobre qué debería ser mi enfoque? –

+0

¿qué hace fillTree exactamente? ¿Es una llamada de Ajax? DOM caminando? lo que toma tanto tiempo? – Joseph

+3

"inserta esa tarea en la línea de ejecución" no es completamente precisa. No interrumpirá el código de usuario ni lo ejecutará concurrentemente; solo se ejecutará cuando no se esté ejecutando código de usuario JS y se haya alcanzado el tiempo de espera. – Lucero

1

es un CMS que estoy utilizando y el árbol se encuentra en el archivo de alguna otra js que estoy de no interferir con lo que se utiliza muchas otras funciones y los casos puede que no sea siempre igual

Si la función fillTree() no se puede modificar, puede envolverla en su propia función y aplicarle una función de devolución de llamada. Prueba esto:

function doStuff(callback) { 
    fillTree(); 

    // Call the callback parameter (checkSelectedBoxes() in this case) 
    // when fillTree() has completed 
    callback(); 
} 

doStuff(checkSelectedBoxes); 
+0

Su respuesta me ayudó con mi función, pero la respuesta a mi pregunta fue dada por @joseph. ¡Gracias! –

0

La función setTimeout no espera de ejecución y se puede comprobar claramente en el siguiente fragmento. Puede ver cómo, dado el array waitTimes de tiempos aleatorios, la función Array.map imprimirá primero todos los valores time[index]=waitTimes[index], luego el wait[index]=waitTimes[index] cuando el setTimeout se active exactamente después de waitTimes[index] milisegundos.

var console = { 
 
    log: function(s) { 
 
    document.getElementById("console").innerHTML += s + "<br/>" 
 
    } 
 
} 
 
var roundDecimals = function(num, pos) { 
 
    pos = pos || 4; 
 
    return (Math.round(num * Math.pow(10, pos))/Math.pow(10, pos)); 
 
} 
 
var arrayRangeMap = function(a, block) { 
 
    c = []; 
 
    while (a--) c[a] = block(); 
 
    return c 
 
}; 
 
var getRandomArbitrary = function(min, max) { 
 
    return (Math.random() * (max - min) + min); 
 
    } 
 
    // random 10 wait times, 3 decimal positions 
 
var waitTimes = arrayRangeMap(10, function() { 
 
    return roundDecimals(getRandomArbitrary(0.250, 0.5, 3) * 1000, 2); 
 
}); 
 

 
waitTimes.map(function(item, index) { 
 
    setTimeout(function() { 
 
    console.log("wait[" + index + "]=" + item); 
 
    }, item); 
 
    console.log("time[" + index + "]=" + item); 
 
});
<div id="console" />

0

acabo de hacer una prueba que pueda ser de su interés:

<!DOCTYPE html> 
<html> 
    <head> 
    <script> 

/* test: if returns in around 1000ms, must interrupt, otherwise it is indeed 
    not going to let timeout work until work is done. */  
window.onload = function() { 
    var before = performance.now(); 
    setTimeout(function() { 
     alert('completed in ~' + (performance.now() - before) + ' nanoseconds.'); 
    }, 1000); 

    /* count to 2^31 - 1... takes 8 seconds on my computer */ 
    for (var i = 0; i < 0xffffffff; ++i) { 
     /* me busy, leave me alone */ 
    } 
};  
    </script> 
    </head> 
    <body> 
    </body> 
</html> 

Ahora estoy realmente curioso cómo sabe JavaScript cuando ha transcurrido cierto tiempo. ¿Engendra un hilo que duerme por un período de tiempo? Y, de ser así, ¿hay un límite sobre cuántos subprocesos duermen o si los subprocesos están "almacenados" hasta que se necesiten?Mucho confundir

Creo que tiene algo que ver con

"Si no tiene por qué ser exactamente 1s, a continuación, sólo usleep un segundo. usleep y dormir poner el hilo actual en un estado de espera eficientes que es al menos la cantidad de tiempo que ha solicitado (y entonces se convierte en elegible para ser programado de nuevo).

Si usted no está tratando de acercarse a la hora exacta que no hay necesidad de comprobar reloj() ".

- pthread sleep function, cpu consumption

así que supongo que el sistema operativo de la programación para usted, en cuyo momento se interrumpe el motor, y el motor se para el mundo y pone la función de tiempo de espera en la parte superior de la cola de ser ejecutado lo antes posible?

Cuestiones relacionadas