2009-09-16 36 views
5

Tôi đang sử dụng ScriptManager.RegisterStartupScript để đăng ký các cuộc gọi đến một số lượng lớn các chức năng JS.RegisterStartupScript và thứ tự thực hiệ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); 

Khi HTML được hiển thị, nó sẽ thêm chúng theo thứ tự.

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

Tuy nhiên, khi tôi bước qua trong chế độ debug, việc thực hiện các kịch bản không theo thứ tự (Ví dụ: EndScript thực hiện đầu tiên trước khi SomeScript1 hoặc SomeScript2)

Liệu không ScriptManager.RegisterStartupScript gaurantee thực hiện theo thứ tự nó đã được thêm vào? Nếu không, các lựa chọn thay thế là gì (Tôi muốn luôn luôn thực hiện EndScript cuối cùng)

Trả lời

6

Từ trang MSDN cho RegisterStartupScript:

khối Startup kịch bản đã được đăng ký bằng cách sử dụng RegisterStartupScript không đảm bảo được đầu ra theo thứ tự mà chúng được đăng ký. Nếu thứ tự của khối tập lệnh khởi động là quan trọng, hãy sử dụng đối tượng StringBuilder để thu thập các khối tập lệnh trong một chuỗi, sau đó đăng ký tất cả chúng dưới dạng một tập lệnh khởi động đơn lẻ.

Sau khi được hiển thị trên trang, việc thực thi các tập lệnh được xử lý bởi trình duyệt và không liên quan gì đến điều khiển ScriptManager. Nhìn vào ví dụ bạn đã đăng, trình duyệt sẽ thực thi những thứ đó theo thứ tự chúng được viết. Chức năng EndScript của bạn có thể được gọi bằng một cái gì đó khác trên trang không? Ngoài ra, nếu bạn đang sử dụng bất kỳ loại gọi lại nào, thì thời gian khi thời gian gọi lại hoàn tất là không xác định. Bạn có thể cung cấp một ví dụ về mã trong mỗi tập lệnh đó không?

+0

Nhưng chúng được bổ sung theo đúng thứ tự. Liên kết MSDN có ngụ ý rằng chúng sẽ được thêm vào đúng thứ tự nhưng không được thực hiện theo thứ tự đã được thêm vào không? Thật không may, tôi không thể thu thập tất cả các khối tập lệnh thành một chuỗi duy nhất. Bất kỳ cách giải quyết nào khác? – Nick

2

Kết quả bạn đã hiển thị được đảm bảo để chạy theo thứ tự đó.

Có thể EndScript bắt đầu thực hiện trước SomeScriptX() đã hoàn thành công việc của mình nếu SomeScriptX phát hành cuộc gọi đến setTimeout từ bên trong cơ thể của họ.

Hoặc, có lẽ "các chức năng khác gọi .." đang gọi EndScript() ở đâu đó sâu.

Dù bằng cách nào, nếu bạn có thể đảm bảo rằng ScriptManager được render rằng thứ tự chính xác về sản lượng, thì đó là thứ tự JavaScript sẽ thực hiện chúng trong.

Các vấn đề liên quan