2010-08-25 65 views
0

我想在一個線程運行時鎖定其他線程。在.Net中有一個鎖對象是可能的。我需要在AJAX中做同樣的事情。如何鎖定Javascript中的線程?

function f_OrnekleriGetir(bKaydet) { 

     var ddlKlinikId = "<%=ddlKliniklker.ClientID%>"; 
     var iKlinikId = $("#" + ddlKlinikId + " option:selected").val(); 
     var arrOrnekNolar = new Array(); 
     $(".tdOrnekNo").each(function(idx, td) { 
      var sOrnekNo = $(td).html(); 
      arrOrnekNolar[idx] = sOrnekNo; 
     }); 

     for (var i = 0; i < arrOrnekNolar.length; i++) { 

       // i want to wait in here... 
       f_OrnekGetirKaydet(arrOrnekNolar[i], iKlinikId, bKaydet); 
      } 
     } 
    } 

這可能嗎?

KR,

Çağın

+1

javascript中的線程? – Amarghosh 2010-08-25 12:32:22

+0

是的。我在一個數組列表中循環。並調用一個函數。但我想等待第一個請求正在運行。 – cagin 2010-08-25 12:37:18

+0

有什麼要求?在上面的代碼中沒有明顯的ajax調用。 – Pointy 2010-08-25 12:49:41

回答

2

你可以用一個循環「鎖定」主線程。不過,這裏有一些主要缺點。

  • JavaScript在瀏覽器的UI線程上運行。這意味着該頁面的UI被鎖定,直到當前正在執行的JavaScript完成,阻止用戶交互和呈現。
  • 某些瀏覽器會檢測到花費很長時間才能完成的腳本,並詢問用戶是否要停止運行它。
  • 如果瀏覽器沒有響應,操作系統可能會詢問用戶是否要關閉瀏覽器。
  • 沒有堅實的休息;子句,可能會陷入無限循環。請記住,除非您退出循環,否則不會執行其他代碼(甚至不會執行回調)。唯一會更改的屬性是異步更改的屬性,如readyState屬性。

如果要在等待Ajax請求時鎖定線程,可以同步發送請求。然而,這與阻塞循環具有相同的缺點。因爲MunkiPhD說,你可能不正確地看問題。回調在JavaScript中被廣泛使用以避免阻塞UI線程,但幾乎可以保證,將代碼構造爲在計時器或事件上使用回調函數將比您目前所想的要好得多。

+0

我把$ .ajaxSetup({async:false}) ;在我的ajax電話之前。問題解決了。感謝您的解釋和建議。 – cagin 2010-08-25 13:30:58

1

你不能這樣做在JavaScript多線程。它都是單線程的。

+0

我認爲他意味着Ajax請求,您可以發送IE並等待多個請求 – 2010-08-25 12:33:36

+1

我收集了這些信息,但它仍然是單線程的。 AJAX回調都發生在同一個線程上,所以不需要鎖定。 – 2010-08-25 12:38:15

+0

As @MunkiPhD表示 - Web Worker是在JS中執行線程的唯一方式 - 但這還不是完全跨瀏覽器呢.... IE 10應該支持這個... – 2013-01-23 08:27:32

0

我不確定您是否可以在Javascript中鎖定線程,但我認爲它歸結爲設計問題。線程應該運行在可以並行運行的進程上。如果你想要一個線程等待來自另一個線程的響應,那麼你正在錯誤地查看這個問題。

無論哪種方式,你調查了Web Workers