2012-11-30 26 views
3

我有一個循環(多個郵件調用)內的jQuery POST函數。
出於某種原因,jQuery正在發佈,但沒有返回所有數據,直到循環結束並一次解析所有結果。jQuery AJAX結果塊不會立即觸發

FOREACH arg_value IN args 
{ 
console.log('Do stuff'); 

    $.post('https://blah.com/xml.php', 
      {arg: arg_value}, 
      function(xml) { 
       $(xml).find('tag').each(function() { 
         console.log('Do more stuff'); 
       }); 
      }); 
} 

的這個輸出是...

做的東西
做的東西
做的東西
不要更多的東西
做更多的東西
做更多的東西

看起來好像jQuery是cac直到最後纔會執行結果。

我期待......

做的東西
不要更多的東西
做的東西
做更多的東西
做的東西
做更多的東西

有一個選項告訴jQuery暫停執行,直到有AJAX結果?它似乎像往常一樣異步運行,但在這種情況下我不希望這樣。

+4

我不認爲任何東西都被緩存在這裏。 AJAX是一個異步調用,只有當調用完成併發回結果時纔會發生更多的事情。雖然你的每個是同步的並執行lineraly(在一個循環中) – ryadavilli

+0

將不會以這種方式運行...在AJAXsuccess返回時,這裏其他代碼得到執行..它異步調用.. – thecodejack

+1

這表現如預期。如果你想讓你的ajax calles以連續的方式觸發,請查看延遲來排序它們。 – Halcyon

回答

3

一個AJAX調用是異步的。這意味着你的回調:

function(xml) { 
    $(xml).find('tag').each(function() { 
     console.log('Do more stuff'); 
    }); 
} 

只有當服務器返回響應時纔會執行。

同時,您的for-each循環將繼續運行,並且記錄Do stuff
除非你在你的循環做瘋狂的事情,循環會比服務器響應
提到的一樣快Jan Dvorak,即使你做瘋狂的事情,在AJAX回調將等待循環來完成,從而導致Do stuff總是出現在任何AJAX響應之前。

+0

即使他做的很瘋狂,服務器的響應也會等待循環結束。 –

+0

@JanDvorak:這是很好的知道,添加信息。 – Cerbrus

+0

給出了這個答案,因爲這是第一個清晰而簡潔的回答。感謝所有的幫助。 – PolishHurricane

0

你是異步這裏,如果你想這樣做可能是實現這一目標的最簡單的方法是使用async.js

1

您的ajax調用是異步的,這意味着ajax調用被觸發,然後繼續執行其他代碼的執行流程。它不會等待迴應。當最終收到響應時,執行回調。

你可以做的是讓你的ajax把所有的堆棧放在一個隊列中,並且當收到每個響應時,引發隊列中的下一個呼叫。這將實現你的死亡效果,從而下一個Ajax調用不會被髮送,直到當前的調用完成。

如果你有很多的調用,這將比一旦需要時全部關閉它們慢得多,因爲瀏覽器可以輕鬆地同時處理多個ajax調用。

1

$。員額()是異步調用...不會在工作循環的方式üwant..To得到üwant..here是解決方案的方式..

var i=0; 
callbackfunc(i) { 
console.log('Do stuff'); 
$.post('https://blah.com/xml.php', 
     {arg: args[i]}, 
     function(xml) { 
      $(xml).find('tag').each(function() { 
       //something related to xml data 
      }); 
      console.log('Do more stuff'); 
       i++; 
       if(i<args.length)callbackfunc(i) 
      } 
     }); 
} 

照顧變量..可能會在這裏創建閉包...

+0

上午通過我參數... – thecodejack

+0

它會更容易通過'i + 1'作爲參數;-) –

+0

嗯...我可以做更多的事情:P .. but thght讓它保持簡單.. – thecodejack