2009-09-16 19 views
5

Sto utilizzando ScriptManager.RegisterStartupScript per registrare le chiamate a un numero elevato di funzioni JS.RegisterStartupScript e ordine di esecuzione

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

Quando l'HTML viene visualizzato, lo sta aggiungendo in ordine.

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

Tuttavia, quando faccio un passo attraverso in modalità debug, l'esecuzione di script non sono in ordine (Es: EndScript esegue prima SomeScript1 o SomeScript2)

Non ritiene ScriptManager.RegisterStartupScript esecuzione gaurantee nell'ordine in cui è stato aggiunto? In caso contrario, quali sono le alternative (voglio eseguire sempre EndScript alla fine)

risposta

6

Dalla pagina MSDN per RegisterStartupScript:

blocchi di script di avvio registrati utilizzando RegisterStartupScript non sono garantiti per essere uscita nello stesso ordine in cui sono registrati. Se l'ordine dei blocchi di script di avvio è importante, utilizzare un oggetto StringBuilder per raccogliere i blocchi di script in una singola stringa e quindi registrarli tutti come un singolo script di avvio.

dopo che sono stati resi alla pagina, l'effettiva esecuzione degli script è gestito dal browser, e non ha nulla a che fare con il controllo ScriptManager. Osservando l'esempio che hai pubblicato, il browser dovrebbe eseguire quelli nell'ordine in cui sono scritti. La tua funzione EndScript potrebbe essere chiamata anche da qualcos'altro sulla pagina? Inoltre, se utilizzi qualsiasi tipo di callback, il momento in cui termina la richiamata è indeterminato. Puoi fornire un esempio del codice contenuto in ciascuno di questi script?

+0

Ma essi vengono aggiunti nell'ordine corretto. Il link MSDN implica che verranno aggiunti nell'ordine corretto ma non eseguiti nell'ordine in cui è stato aggiunto? Sfortunatamente, non riesco a riunire tutti i blocchi di script in una singola stringa. Altre soluzioni alternative? – Nick

2

L'output visualizzato è garantito per l'esecuzione in questo ordine.

E 'possibile che EndScript inizia l'esecuzione prima SomeScriptX() ha completato il loro lavoro se SomeScriptX problema chiama a setTimeout da dentro i loro corpi.

O forse "altre funzioni chiama .." sta invocando da qualche parte in profondità EndScript().

In entrambi i casi, se si può garantire che ScriptManager sta rendendo questo ordine esatto nella sua uscita, che poi è l'ordine di loro eseguirà JavaScript.

Problemi correlati