2011-05-09 96 views
7

我們都在AJAX教程中看到了一些發送數據的例子。他們都(或多或少)是這樣的:什麼是正確的方式來管理多個Ajax請求?

var http = createRequestObject(); // shared between printResult() and doAjax() 

function createRequestObject() { /* if FF/Safari/Chrome/IE ... */ ... } 

function printResult() 
{ 
    if (http.readyState == 4) { ... } 
} 

function doAjax() { 
    var request = 'SomeURL'; 
    http.open('post', request); 
    http.onreadystatechange = printResult; 
    data = ...; // fill in the data 
    http.send(data); 
} 

// trigger doAjax() from HTML code, by pressing some button 

下面是這種情況,我不完全理解:如果被按下按鈕幾次非常快?應該doAjax()以某種方式重新初始化http對象?如果該對象被重新初始化,那麼正在進行的請求會發生什麼?

PS:對主持人:這個問題可能與更多的社區維基。如此處所述(https://meta.stackexchange.com/questions/67581/community-wiki-checkbox-missing-in-action) - 如果我說得對 - 請正確標記此問題。

+1

+1這是一個常見問題的好問題 – 2011-05-09 08:04:32

回答

2

當然,現在有大量的圖書館能夠完成體面的工作,應該在生產環境中使用。但是,我的問題是關於這些隱藏的細節。所以我在這裏找到了lamda-calculus-like方法來爲每個請求提供專用的請求對象。這些對象顯然會傳遞給被調用時響應到達等回調函數:Chrome和IE9下試驗成功

function printResult(http) { 
    if (http.readyState == 4) { ... } 
    ... 
} 

function doAjax() { 
    var http = createRequestObject();  
    var request = 'SomeURL'; 

    http.open('get', request);  
    http.onreadystatechange = function() { printResult(http); }; 
    http.send(null); 
    return false; 
} 

1

我用每頁的請求隊列來處理這種情況下(以抑制重複的請求並確保請求的順序),但也有可能是一個更標準化的解決方案。

,因爲這不是默認提供,您需要實現它在你的網頁在JavaScript(或鏈接腳本)。單擊一個按鈕就可以將請求添加到隊列中,而不是啓動Ajax請求。如果隊列爲空,則執行Ajax請求,並使用回調刪除排隊條目並執行下一個(如果有)。

參見:How to implement an ajax request queue using jQuery

+0

我也使用每個頁面的請求,我?但它如何解決/抑制重複的請求? – BreakPhreak 2011-05-09 08:13:18

3

由於AJAX有asynchronus性質,與每個按鈕點擊要提高,將GET/POST一些數據FROM/TO服務器異步事件。您提供一個回調函數,因此在服務器完成數據處理時會多次觸發它。

,缺省爲正常行爲,你不應該重新初始化HTTP對象。如果您想要顯示多個發送操作,則必須手動執行該操作(例如,首次調用時禁用按鈕)。

我也建議使用jQuery $就因爲它incapsulate許多這些細節。

+0

調用XMLHTTPRequest對象的打開函數將中止發送算法並取消該對象負責的任何網絡活動。僅僅因爲它是異步的並不意味着一個對象可以同時處理多個請求,事實上它不能。 – 2011-05-09 08:31:41

相關問題