2011-07-15 57 views
0

我有以下情況:在Javascript中排隊或允許多個AJAX請求?

用戶有能力將控件拖放到頁面上。在「滴」客戶端事件initaties的ajaxRequest像這樣:

function OnClientDropping(sender, eventArgs) { 
    var sourceItem = eventArgs.get_sourceItem(); 
    var droppedID = eventArgs.get_htmlElement().id; 

    if (droppedID.indexOf("RadDockZone") != -1) { 
     if ($find(droppedID).get_docks().length == 0) { 
      var eventData = {}; 
      eventData["sourceItemText"] = sourceItem.get_text(); 
      eventData["sourceItemValue"] = sourceItem.get_value(); 
      eventData["listBoxID"] = sender.get_id(); 

      $find(ajaxManagerID).ajaxRequestWithTarget(droppedID, $.toJSON(eventData)); 
    } 
} 

現在,雖然這ajaxRequest處理過程中,用戶仍然擁有自己的鼠標完全控制。對於他們希望在該事件仍在處理時將另一個控件拖放到頁面上的情況並不罕見。

目前,如果他們這樣做,第一個事件被取消,然後第二個事件成功運行。我想知道如何排隊這些事件?我試着簡單地將上述代碼包裝在「$ .queue($ find(ajaxManagerID).....)」中,但是我沒有注意到我的項目運行方式有任何變化。

支持這種情況的正確方法是什麼?

if (queue.length == 0) { 
    queue.push(uniqueDockZoneID); 
    queue.push(eventData); 
    $find(ajaxManagerID).ajaxRequestWithTarget(uniqueDockZoneID, $.toJSON(eventData)); 
} 
else { 
    queue.push(uniqueDockZoneID); 
    queue.push(eventData); 
} 

function endRequest(sender, eventArgs) { 

    if (queue.length > 0) { 
     queue.shift(); //Remove the ID of the control we just finished. 
     queue.shift(); //Remove the data for the control we just finished. 
    } 

    //If we've got more ajax requests queued up. 
    while (queue.length > 0) { 
     uniqueDockZoneID = queue.shift(); 
     data = queue.shift(); 
     $find(ajaxManagerID).ajaxRequestWithTarget(uniqueDockZoneID, $.toJSON(data)); 
    } 
} 

回答

1

你爲什麼不只是添加UNIQUEID和dockZoneID到一個數組,然後根據相關的Ajax請求被完成了從數組中刪除的每個項目?

+0

對不起,我覺得我的例子很差。讓我稍微編輯一下代碼。我不是試圖更新一個ajaxRequest中的兩個項目。整個功能稍後將被獨立的項目再次調用。 –

+0

我仍然認爲你可以使用一個數組來管理你的未決請求 –

+0

也許我很困惑。您是否建議存儲一個範圍外數組,將dropID推入數組,然後在彈出數組中的第一個元素之後執行ajax請求?我覺得jQuery的fx隊列是爲此目的而創建的?我應該能夠將ajax請求推送到這個隊列中,不是嗎? –