2010-09-03 30 views
0

我正在製作一個郵件列表腳本,它利用ajax(async = false)以塊的形式發送電子郵件。JavaScript循環使UI無響應

基本上週期是這樣的:

var i = 0; 
for(i;i<num_rows;i=i+mxt){ 
    if($("#panic").val()=='1'){ 
     break; 
    } 
    perc = (i*100)/num_rows; 
    startThread(i,perc); 
} 

臨屋恐慌值由一個按鈕設置,問題是,在循環過程(的作品),我不能與頁面交互。

我在做什麼錯?

謝謝

編輯:

function startThread(i,perc){ 
l_a = i; 
l_b = mxt; 

headers = '&mail_from='+mail_from+'&mail_from_name='+mail_from_name+'&mail_subject='+mail_subject; 

$.ajax({ 
    type: "POST", url: "ajax/thread.php", data: "l_a="+l_a+"&l_b="+l_b+headers, 
    success: function(html){ $("#progressbar").progressbar({value: perc}); }, 
    async: false 
}); 
} 
+1

聽起來很正常。你以這種方式處理了多少行? – 2010-09-03 08:53:11

+0

總計超過30k,每個線程100行。這件事就像一個魅力,唯一的問題是,我想要一種方式來阻止它完成。 – 0plus1 2010-09-03 08:56:38

+0

你能提供'startThread'的代碼嗎? – GenericTypeTea 2010-09-03 09:00:58

回答

4

startThread()函數名稱是一種誤導,在,因爲JavaScript不僅單線程的網頁瀏覽器,但這股與頁面呈現在同一個線程。

由於您使用的是async=false$.ajax調用成爲阻塞函數,並且這會阻止頁面呈現線程,從而導致UI無響應。

引述jQuery documentation(強調):

異步

默認:true

默認情況下,所有的請求被髮送異步(即這是默認設置爲true) 。如果您需要同步請求,請將此選項設置爲false。跨域請求和dataType:「jsonp」請求不支持同步操作。 請注意,同步請求可能會暫時鎖定瀏覽器,並在請求處於活動狀態時禁用任何操作。

可能的解決方案:

  • 背馱式在一個JSON對象的數據,併發送只有一個$.ajax請求。如果可能的話使用async=true
+0

不,你錯了,嘗試從for循環中註釋startThread,你會發現它是for循環而不是用來阻塞UI的ajax調用! – 0plus1 2010-09-03 09:18:47

+0

我想添加別的東西。如果你用ajax調用(async)啓動一個for循環,你基本上就會破壞這個目的。每個線程發送大量的電子郵件然後暫停,如果我啓動了100多個併發Ajax調用將發送全部到SMTP服務器相同。 – 0plus1 2010-09-03 09:21:53

+0

@ 0plus1:感謝downvote :) ...但是,兩者都阻止。具有'async = false'的'$ .ajax()'會阻塞,直到服務器返回一個響應。這通常是幾十/幾百毫秒......取決於迭代次數,for循環塊。做一個'while(true){}'阻止UI ...我不知道你的應用程序的邏輯。我只是試圖告訴你爲什麼你有問題。 – 2010-09-03 09:22:31