2015-06-04 37 views
2

我想從JQuery Ajax發送數據到一個通用處理程序,它可以計算出某些東西並返回結果。 Ajax請求在JQuery結尾的for循環內進行。該代碼看起來是這樣的:JQuery Ajax如何工作?

function send(Handler, ids) { 
    var URL = "http://" + window.location.host + "/Handlers/" + Handler + ".ashx"; 
    var i; 
    for (i = 0; i < 10; i++) { 
     var cur = $('.' + ids[i]); 
     $.ajax({ 
      url: URL, 
      type: "POST", 
      data: JSON.stringify({ 
       Data: cur 
      }), 
      dataType: "json", 
      cache: false, 
      beforeSend: //my before send code, 
      success: //my success code, 
      error: //my error code 
     }); 
    } 
    alert('Done!'); 
} 

我把3斷點在Visual Studio 2012在行:

$.ajax({ 

在通用處理器在第一線這個

alert('Done!'); 

;第三斷點。

現在,當我嘗試執行這段代碼,阿賈克斯很好地工作在異步方式。但是,當它到達第一個斷點時,停在那裏然後我繼續它,而不是到達通用處理程序的斷點,它繼續循環並返回到第一個斷點。然後,在到達第二個斷點後,它會一次又一次地停止在通用處理程序的中斷點處爲每個值。

那麼,這是否意味着阿賈克斯首先收集所有的Ajax請求,然後for循環之後一起執行呢?

+3

號,請求並立即進行通話開始阿賈克斯'$()',但循環繼續開始下一個請求或'警報(「完成!」)'之前沒有完成。處理程序('success'等)被設置爲在接收到響應時被調用,這在「他們自己的時間」(異步地)發生,未被循環或彼此解綁。 –

+0

如果服務器代碼也在您的控制之下,那麼擁有一個返回多個結果的Web服務(例如,一個ID數組)會比您所做的更有效率。作爲副作用,如果切換到該模式,您將避免此問題。 –

回答

2

JavaScript是單線程和非阻塞。這意味着在第一次迭代中不會等待ajax調用完成,它會返回並開始第二次迭代,等等。 所以,不,它不會一起執行它們。它肯定會按照循環的順序啓動ajax調用,但是沒有辦法知道什麼會先結束。它可能會讓所有的ajax調用,然後得到一個答案(並不意味着它是第一次迭代的答案),或者在循環中間它可能會得到答案。

2

如果我理解正確,你剛纔已經回答你自己的問題。 Ajax的工作在異步意味着for循環開始,並觸發了Ajax請求,並繼續循環(Ajax請求塊)

因此,這是極有可能是JS的請求之前執行的代碼迴路到達您的網址(因爲這有可能創造一個網絡電話)

這就是說,你在你的beforeSend方法在做什麼?也許這使得它在發送第一個請求之前花費足夠的時間來執行循環的所有迭代?

要回答你的問題,沒有它不應該等待for循環,以歡送的要求來完成,應該儘快啓動過程所做的通話