【问题标题】:In what order does DOJO handles ajax requests?DOJO 以什么顺序处理 ajax 请求?
【发布时间】:2011-02-17 22:41:30
【问题描述】:

在对话框中使用表单 我在 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 中的缓存属性设置为 false,但结果仍然相同。

请帮忙!

【问题讨论】:

    标签: javascript ajax jsp dojo


    【解决方案1】:

    正如 Alex 所说,异步请求就是这样——它们的顺序没有保证。如果您想保证它们的顺序,可以根据需要使它们同步。有一个选项sync: true 我认为您可以使用请求参数发送。这会导致浏览器在请求返回之前冻结,因此除非您别无选择,否则不建议这样做,并且请求非常快。

    您还可以提交您需要的任何数据以及当前请求的数据。例如,假设下拉列表 A 的值决定了下拉列表 B 中可用的列表选项。与其在下拉列表 A 更改时提交更改,然后刷新下拉列表 B 的选项,不如在打开下拉列表 B 时提交 A 的值,并在确定 B 选择的服务器逻辑中对其进行处理。 (这假设您有一个下拉小部件,其中包含服务器生成的选项,而不是标准标签。)

    【讨论】:

    • 好主意!这有效并简化了我的代码。我现在将它作为一个请求发送,并且响应是带有添加对象的更新下拉列表。
    【解决方案2】:

    Ajax 中的第一个 A 代表“异步”,这意味着事情“按照自己的节奏”发生:请求很可能按照您期望的顺序发送,但它们完成 恰恰相反,因为第二个更快。是的,当然,您甚至可以等待 start(发送)第二个请求,直到第一个请求完成 - 最简单的是,您可以将第二个请求的开始放在第一个请求的回调函数中.

    【讨论】:

    • 我无法将第二个请求放在第一个的回调函数中,因为第二个请求用于网站的其他部分,而第一个没有。有没有办法控制响应的处理顺序?
    • @mm2887,你可以做你想做的事——如果第一个函数正在运行并且还没有被回答,那么延迟第二个函数——但是如果你可以改变你的架构,它就会很混乱会好很多。无论如何,例如:有一个全局布尔标志通常为真。代码在发送第一个 ajax 调用之前将其设置为 false,并在响应到达时将其设置为 true。第二次调用检查标志,如果为假,它每次循环休眠 100 毫秒左右,直到它变为真。
    • 感谢您的想法,但它似乎像您说的那样混乱,所以我将这两个请求合并为一个。
    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多