2013-05-20 106 views
0

我有以下問題:循環之前執行的循環中的AJAX調用結束

我有一個循環:

// Code A 
. . . 
for (var key in dict){ 
    // Code B 
    . . . 
    var list = this.initializeList(); 
    var selfRef = this; 

    jQuery.ajax({ 
     dataType: 'json', 
     url: '/someUrl', 
     data: {'sent_data': sendData}, 
     success: function (recievedData){ 
      this.function(list); 
     } 
    }); 

    // Code C 
    . . . 
} 
// Code D 
. . . 

現在,這種理想的方式是,如果執行的順序代碼是:

  1. 代碼A
  2. for循環:
    • 碼B
    • AJAX
    • 代碼C
  3. 代碼d

但是,問題是,在步驟2中的循環:第一,碼B被執行,並且下一個 - 的AJAX調用,然後再次使用AJAX代碼而不是代碼C。在下一次迭代中,AJAX代碼再次執行,而不是代碼B.對於我來說執行的順序如上所述,對我來說非常重要。正如你所見,變量列表應該爲每個循環重新初始化,但相反,我們有多個AJAX調用只有第一次初始化。

我該如何解決這個問題?

+8

這是bcoz .. Ajax是異步的 –

+4

重新組織它,以便循環和發送30個Ajax請求,而不是循環並創建30條數據併發送1個Ajax請求。 –

+1

你需要使你的Ajax請求順序,就像第一個完成後發送第二個請求 –

回答

5

你需要讓$.ajax()同步(而不是默認的異步),像這樣:

$.ajax({ 
    ... 
    async: false 
}); 

這將導致腳本執行,直到$前阿賈克斯結束等待它繼續執行res t的腳本。

我希望這有助於!

+0

Tnx,兄弟,這解決了這個問題!我會盡快接受你的回答(仍然有一些時間可以通過^^) – Belphegor

+0

但是請注意,使用'async:false'通常是一個糟糕的主意,在這種情況下這是一個糟糕的主意,即使它確實做到了工作。這將導致瀏覽器似乎被鎖定,直到for循環和其中的所有ajax請求完成。在本地測試時可能幾乎不可察覺,而當由不在本地的人訪問時會更糟糕。 –

+0

除非在AJAX完成請求時不需要做其他任何活動,否則您可以使用它。如果用戶應該能夠在頁面中執行其他操作,那麼這不是一條可行的路。 – Niche

3

AJAX(因爲它的名稱說明)是異步,這意味着它不會按特定順序執行。相反,只要服務器響應初始呼叫,就會執行AJAX調用。你可以做些什麼來糾正這個問題是增加你的功能的延遲,或者在AJAX調用中添加一個回調函數,這樣你就可以確保代碼在AJAX調用完全執行之後才被執行。

將代碼D回調:

// Code A 
... 

//run Code D if loop exhausted 
var dCheckCount = 0; 
function dCheck() { // will be called once for each ajax call 
    dCheckCount++; 
    if (dCheckCount === dict.length) { // # finished ajax calls = loop size 
    // Code D 
    ... 
    } 
} 

for (var key in dict) { 
    // Code B 
    ... 

    jQuery.ajax({ 
    dataType: 'json', 
    url: '/someUrl', 
    data: {'sent_data': sendData}, 
    success: function (recievedData){ 
     this.function(list); 
     // Code C 
     ... 

     // check if can run Code D 
     dCheck(); 
    } 
    }); 

} 
+0

感謝您的澄清。僅供參考,我解決了這個問題,因爲@dSquared在他的回答中解釋了我。乾杯,+1! – Belphegor

相關問題