在Javascript中排队或允许多个AJAX请求?

时间:2011-07-15 21:32:47

标签: javascript radajaxmanager

我有以下情况:

用户可以将控件拖放到页面上。 'drop'客户端事件初始化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 个答案:

答案 0 :(得分:1)

为什么不直接将uniqueId和dockZoneID添加到数组中,然后在关联的ajax请求完成后从数组中删除每个项目?