簡體   English   中英

DOJO以什么順序處理ajax請求?

[英]In what order does DOJO handles ajax requests?

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

<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,但結果仍然相同。

請幫忙!

就像Alex所說的,異步請求僅僅是-不保證它們的順序。 如果要保證他們的訂單, 可以根據需要使它們同步。 有一個選項sync: true是的,我認為您可以與請求args一起發送。 這將導致瀏覽器凍結,直到請求返回為止。因此,除非沒有其他選擇,否則建議不要這樣做,並且請求非常快。

您還可以提交所需的任何數據以及當前請求的數據。 例如,假設下拉列表A的值確定了下拉列表B中可用的列表選項。與其在更改下拉列表A時提交更改,然后刷新下拉列表B的選項,不如提交更改,而是在打開下拉列表B時提交A的值,並在確定B的選擇的服務器邏輯中進行處理。 (這假設您有一個下拉窗口小部件,其中包含服務器生成的選項,而不是標准標記。)

Ajax中的第一個A表示“異步”,這意味着事情以“自己的速度”發生:很有可能按照您期望的順序發送請求,但是它們的完成完全相反,因為第二個請求更快。 是的,當然,您甚至可以等待甚至開始 (發送)第二個請求,直到第一個請求完成為止-最簡單的是,您可以將第二個請求的開始放在第一個請求的回調函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM