2012-04-14 57 views
24

我開發了一些網站,我總是碰到一個相同的問題:多個ajax電話。我有一個主頁面,所有的內容都是異步加載的。加載頁面時,有四個獨立調用按頁面(頂部,左側,右側和底部)「繪製」頁面,並在加載時向用戶顯示典型的ajax旋轉。所以,當瀏覽器收到請求時,我執行回調,不同的區域在不同的時間繪製。事實是,服務器的答案有時會混淆在一起,我的意思是,top的答案是左邊的,反之亦然。同時發送多個ajax電話

我已經嘗試了一些解決方案,比如在每個請求中創建一個時間戳,以向瀏覽器和服務器表明每個請求都不相同。

另外我試過在服務器上配置緩存的一些參數,以防萬一。

在其中工程已包括在一個回調的請求2的唯一途徑等

任何人都知道正確的方式去做或曾經擊敗這個問題?我不想做鏈接請求。

感謝

這裏是我的意思的例子:

$(document).ready(function() { 

$.get('/activity',Common.genSafeId(),function(data){$('#stream').html(data);$("#load_activity").addClass("empty");}); 
$.get('/messages',Common.genSafeId(),function(data){$('#message').html(data);$("#load_messages").addClass("empty");}); 
$.get('/deals',Common.genSafeId(),function(data){$('#new_deals_container').html(data);$("#load_deal").addClass("empty");}); 
$.get('/tasks',Common.genSafeId(),function(data){$('#task_frames').html(data);$("#load_task").addClass("empty");});}); 

和HTML是一個簡單的JSP有四個容器每一個具有不同的ID。

+3

你是什麼意思,答案是在錯誤的地方畫的?正確構造的Ajax調用將更新佈局中非常特定位置的HTML的特定部分。發佈一些簡單的代碼來說明問題。 – 2012-04-14 01:12:06

+0

你是否用$('#container')。append()來添加內容到你的頁面? – jimw 2012-04-14 01:18:25

+0

是的,我更新了這篇文章。內容被添加到DOM,但有時候請求會將內容繪製在不合適的ID中。我知道這很奇怪,因此我通常會做鏈式要求。感謝您的答覆。 – 2012-04-14 01:50:50

回答

-5

確保每個ajax調用都有不同的回調函數,這聽起來像是你試圖對所有四個函數使用相同的函數,因此當它們被亂序調用時(因爲它們在服務器端需要不同的時間) ,他們正在渲染錯誤的地方。如果你堅持對所有的回調函數使用相同的函數,那麼你必須在有效載荷中放入一些東西,以便回調知道要渲染到哪裏。

+2

單獨的函數不是解決這個問題的方法。在閉包中保留一個值很容易,以確定響應應該到哪裏。 – 2012-04-14 01:25:56

+0

True Beetroot-Beetroot,但我敢打賭他沒有使用jQuery。 – 2012-04-14 01:33:00

+3

誰說你需要jQuery來完成關閉? – 2012-04-14 01:34:52

39

封閉件

Closures有點令人興奮的在第一。它們是javaScript和其他幾種現代計算語言的一個特性。

閉包由具有內部函數(通常爲匿名事件處理程序或命名方法)的函數的已執行實例形成,該函數需要訪問一個或多個外部變量(即外部函數內的變量但在內部函數之外)。令人興奮的事情是內部函數保留對外部變量的訪問,即使外部函數已經完成並在內部函數執行時返回!

此外,由封閉捕獲的變量可以訪問只有內部功能,而不是進入封閉的進一步環境。例如,該功能可以讓我們創建具有私人和公共成員的類似結構,即使在沒有語言關鍵字「公共」和「私人」的情況下也是如此。

閉包是由內部函數使用外部變量抑制javaScript的「垃圾收集」,否則它會在完成後的某個不確定點破壞外部函數的環境。

封閉對良好,整潔的javaScript編程的重要性不可能過分。

在下面的功能getData()形式的代碼,在每個呼叫,關閉捕捉id1id2(和url),它仍然可以匿名Ajax響應處理程序($不用彷徨的第三個參數)。

$(document).ready(function() { 

    function getData(url, id1, id2) { 
     $.get(url, Common.genSafeId(), function(data) { 
      $(id1).html(data); 
      $(id2).addClass("empty"); 
     }); 
    } 

    getData('/activity', '#stream', '#load_activity'); 
    getData('/messages', '#message', '#load_messages'); 
    getData('/deals', '#new_deals_container', '#load_deal'); 
    getData('/tasks', '#task_frames', '#load_task'); 

}); 

因此,而不是寫四個獨立的處理器,我們利用語言的形成封鎖和調用相同功能,getData(),四次能力。在每個調用中,getData()形成一個新的閉包,它允許$ .get的響應處理程序(在服務器響應時異步調用)處理其的DOM元素。

+3

我從這個答案中學到了很多東西,但花了一段時間才弄清楚問題中原始代碼有什麼問題。是不是因爲變量「data」實際上是每個調用的相同對象/實例,所以也被內部函數(閉包)重用?我猜我半期望JavaScript運行時會知道在這裏創建4個獨立的對象,因爲它們在那個(有點奇怪的)範圍內使用,並且從不在之前或之外。當然很高興我不需要在與我合作的大多數其他語言中處理這種模糊的程度。 – eselk 2013-02-01 23:49:27

+0

@eselk,在9個月後再次審視這個問題,我不確定問題中的代碼如何/爲什麼會混雜起來。我認爲在我開始回答這個問題之後必須添加它,我想知道這是OP自己的解決方案,而不是描述了症狀的代碼。可以肯定的是,四個獨立的函數,每個$ .get()都是不必要的。我的'getData()'函數簡化了事情。一旦你把思想封閉起來,它們就非常簡單 - 在實踐中肯定比正式的定義更容易相信。 – 2013-02-02 02:18:05

+0

@ Beetroot-Beetroot我需要在頁面加載時同時進行12個ajax調用。它似乎有一個響應被複制到另一個。這是由於瀏覽器併發呼叫數量的限制嗎? – 2016-08-12 10:49:11