2010-05-11 26 views
2

在對話框中使用表單我在jsp中使用Dojo將表單保存到數據庫中。在使用dojo.xhrPost()完成請求後,我發送另一個請求來更新下拉框,該框應包含剛剛保存的添加表單對象,但由於某種原因,在保存表單之前執行了更新下拉列表的請求在數據庫中,即使首先調用表單保存。使用Firebug我可以看到getLocations()請求在sendForm()請求之前完成。這是代碼:DOJO以何種順序處理Ajax請求?

<button type="button" id="submitAddTeamButton" dojoType="dijit.form.Button">Add Team 
        <script type="dojo/method" event="onClick" args="evt"> 

         sendForm("ajaxResult1", "addTeamForm"); 
         dijit.byId("addTeamDialog").hide(); 
         getLocations("locationsTeam"); 
        </script> 

function sendForm(target, form){ 
    var targetNode = dojo.byId(target); 

    var xhrArgs = { 
     form: form, 
     url: "ajax", 
     handleAs: "text", 
     load: function(data) { 

      targetNode.innerHTML = data; 
     }, 
     error: function(error) { 
      targetNode.innerHTML = "An unexpected error occurred: " + error; 
     } 

    } 

    //Call the asynchronous xhrGet 
    var deferred = dojo.xhrPost(xhrArgs); 
} 

function getLocations(id) { 
    var targetNode = dojo.byId(id); 

    var xhrArgs = { 
     url: "ajax", 
     handleAs: "text", 
     content: { 
      location: "yes" 
     }, 
     load: function(data) { 

      targetNode.innerHTML = data; 
     }, 
     error: function(error) { 
      targetNode.innerHTML = "An unexpected error occurred: " + error; 
     } 
    } 

    //Call the asynchronous xhrGet 
    var deferred = dojo.xhrGet(xhrArgs); 
} 

爲什麼會發生這種情況?在第二次執行之前有辦法讓第一個請求完成嗎?

爲了減少這種情況發生的可能性,我嘗試將xhrGet中的cache屬性設置爲false,但結果仍然相同。

請幫忙!

回答

4

正如亞歷克斯所說,異步請求就是這樣 - 它們的順序不能保證。如果你想保證他們的訂單,你可以可以使他們同步,如果你喜歡。有一個選項sync: true我認爲你可以用請求參數發送。這會導致瀏覽器凍結,直到請求恢復爲止,因此除非沒有其他選項,否則不建議這樣做,並且請求非常快。

您還可以提交您需要的任何數據以及當前請求的數據。例如,假設下拉A的值決定了下拉列表B中的可用列表選項,而不是在下拉列表A更改時提交更改,然後刷新下拉列表B的選項,您可以在打開下拉列表B時提交A的值,並在確定B的選擇的服務器邏輯中處理它。 (這裏假定你有一個下拉小部件,其選擇由服務器生成,而不是標準標籤。)

+0

好主意!這工作和簡化了我的代碼。 我現在將它作爲一個請求發送,並且使響應成爲更新的添加對象的下拉列表。 – mm2887 2010-05-11 16:48:09

3

Ajax中的第一個A代表「異步」,這意味着發生的事情「按照自己的步調」:最有可能的請求是在你期望的順序發送,但他們完成周圍的其他方法簡單因爲第二個更快。是的,當然你可以等到開始(發送)第二個請求,直到第一個請求完成 - 最簡單的說,你可以把第二個請求的開始放在第一個請求的回調函數中。

+0

我不能把第二個請求放在第一個回調函數中,因爲第二個請求用在其他第一個不在的網站的部分。 有沒有辦法控制響應處理的順序? – mm2887 2010-05-11 01:43:45

+0

@ mm2887,你可以做你想做的事 - 如果1st正在運行並且還沒有被應答,則延遲第二個函數 - 但是如果你可以改變你的體系結構,那就太麻煩了。無論如何,例如:具有通常爲真的全局布爾標誌。在發送第一個Ajax調用之前,代碼將其設置爲false,並在該響應到達時將其設置爲true。第二次調用檢查標誌,如果爲false,則每次循環休眠100毫秒,直到它變爲真。 – 2010-05-11 03:02:51

+0

感謝您的想法,但似乎像你說的那樣混亂,所以我把兩個請求合併爲一個。 – mm2887 2010-05-11 16:49:15