2010-04-10 49 views
3

我有一個包含多個表單的頁面,我通過Ajax POSTs連續提交。起初,我嘗試使用同步XHR請求,但這會導致瀏覽器在請求期間鎖定,並打破我的DOM操作效果,這是不可接受的。所以,我最終使用的模式基本上是這樣的:有沒有更好的方法來連續提交多個AJAX請求?

var fcount = 0; // incremented for each form to be submitted 
function submit_form(num) { 
    var fdata = { ... }; // data from form # num 
    $.ajax({ async: true, 
       url:  '/index.cgi', 
       data:  fdata, 
       type:  'POST', 
       success: function() { 
        if (num < fcount) { 
         submit_form(++num); 
        } 
       } 
      }); 
} 

$('#submit_form_btn').click(function() { submit_form(1) }); 

遞歸令我有點醜陋的解決方案,以什麼本質上是一個反覆的問題。有沒有更清潔或更優雅的方式可以處理?

+0

你爲什麼一件件發送數據?有很多這樣的東西或類似的東西嗎? – 2010-04-10 20:29:28

+0

@Matti - 每個請求都需要一段時間來處理(需要進行文件上傳)。在單個請求中處理太多。 – friedo 2010-04-10 20:34:09

+0

迭代和遞歸沒有他們第一次出現那麼不同(http://stackoverflow.com/questions/931762/can-every-recursion-be-converted-into-iteration,http://mitpress.mit.edu/ SiC顆粒/全文/電子書/圖書ZH-11.html#%_ sec_1.2)。既然你正在處理異步回調,堆棧增長並不是什麼大問題。 – outis 2010-04-10 20:55:45

回答

10

這些請求是冪等的嗎?如果是的話,你可以簡單地將它們一個接一個地燒掉。否則,你會受到AJAX異步特性的限制。

UPDATE

我做了一些更多的研究,顯然存在一個名爲jQuery Message Queuing框架,處理通過消息隊列串行AJAX請求。也許這可以幫助你。

+1

+1好的發現,具體到我提出的解決方案 – 2010-04-10 20:57:29

+0

非常酷 - 我可能會最終使用這個或做類似的事情。 – friedo 2010-04-10 21:13:38

+0

是的,這是一個非常酷的解決方案:)我可能最終也會使用它! – 2010-04-11 03:07:44

1

更簡潔的方法是維護一個你想要製作的回調隊列(ajax請求)並逐個將它們解除。

+2

但是如何在等待隊列中的每個請求完成時阻止? – friedo 2010-04-10 20:35:09

+0

@friedo:你必須保持一個標誌來做到這一點 – 2010-04-10 20:40:00

0

我會說在服務器上提高腳本的超時時間,並在一個POST中發送所有內容。

0

如果你想要做的是你的代碼做什麼,它只是使用遞歸結構。

但是,這裏的可疑部分使用了多個呼叫,您正在浪費大量時間提交多個呼叫。如果以任何可能的方式將這些數據保存在一次調用中並將其結束,那麼這是迄今爲止的首選方法。

相關問題