2009-09-16 17 views
5

Estoy usando ScriptManager.RegisterStartupScript para registrar llamadas a un gran número de funciones JS.RegisterStartupScript y orden de ejecución

ScriptManager.RegisterStartupScript(this, this.GetType(), "Script1", "SomeScript1", true); 
ScriptManager.RegisterStartupScript(this, this.GetType(), "Script2", "SomeScript1", true); 
ScriptManager.RegisterStartupScript(this, this.GetType(), "EndScript", "EndScript", true); 

Cuando se representa el código HTML, que son ellos con el fin de añadir.

<script type="text/javascript"> 
//<![CDATA[ 
other functions calls.. 
SomeScript1();SomeScript2();EndScript(); 
//]]> 
</script> 

Sin embargo, cuando me paso a través en modo de depuración, la ejecución de secuencias de comandos no están en orden (Ej: EndScript ejecuta primero antes de SomeScript1 o SomeScript2)

Does not ScriptManager.RegisterStartupScript ejecución gaurantee en el orden que ¿fue añadido? Si no es así, ¿cuáles son las alternativas (quiero siempre ejecutar EndScript al final)

Respuesta

6

Desde la página de MSDN para RegisterStartupScript:

bloques de script de inicio que se registran mediante el uso de RegisterStartupScript no están garantizados para dar salida en el mismo orden en que están registrados. Si el orden de los bloques de scripts de inicio es importante, use un objeto StringBuilder para reunir los bloques de scripts en una sola cadena y luego registrarlos todos como un solo script de inicio.

después de que se prestan a la página, la ejecución real de los guiones es manejado por el navegador, y no tiene nada que ver con el control ScriptManager. Al observar el ejemplo que ha publicado, el navegador debe ejecutarlos en el orden en que están escritos. ¿Podría su función EndScript ser llamada por otra cosa en la página también? Además, si está utilizando cualquier tipo de devoluciones de llamada, entonces el momento en que finaliza la devolución de llamada es indeterminado. ¿Puedes dar un ejemplo del código que está en cada uno de esos scripts?

+0

Pero ellos se añaden en el orden correcto. ¿El enlace de MSDN implica que se agregarán en el orden correcto pero no se ejecutarán en el orden en que se agregaron? Desafortunadamente, no puedo reunir todos los bloques de script en una sola cadena. ¿Alguna otra solución? – Nick

2

Se garantiza que la salida que ha mostrado se ejecutará en ese orden.

Es posible que EndScript comienza a ejecutar antes de SomeScriptX() ha completado su trabajo si SomeScriptX tema llama a setTimeout desde el interior de sus cuerpos.

O, tal vez "otras llamadas de funciones ..." está invocando EndScript() en algún lugar profundo.

De cualquier manera, si se puede garantizar que ScriptManager encuentra prestando ese orden exacto en su salida, a continuación, que es del orden de JavaScript se ejecutará en.

Cuestiones relacionadas