DOJO以什么顺序处理ajax请求?

时间:2010-05-11 01:09:19

标签: javascript ajax jsp dojo

在对话框中使用表单我在jsp中使用Dojo将表单保存在我的数据库中。在使用dojo.xhrPost()完成该请求之后,我发送另一个请求来更新一个下拉框,该下拉框应该包含刚刚保存的添加的表单对象,但由于某种原因,在保存表单之前执行更新下拉列表的请求即使首先调用表单save,也在数据库中。使用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,但结果仍然相同。

请帮忙!

2 个答案:

答案 0 :(得分:4)

正如Alex所说,异步请求就是这样 - 他们的订单无法保证。如果您想保证他们的订单,您可以 使它们同步。有一个选项sync: true我认为你可以发送请求args。这会导致浏览器冻结直到请求返回,因此除非您没有其他选项,否则不建议使用,并且请求非常快。

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

答案 1 :(得分:3)

Ajax中的第一个A代表“异步”,这意味着事情“按照自己的节奏”发生:很可能请求按照您期望的顺序发送,但它们完成反过来只是因为第二个更快。是的,当然你可以等到启动(发送)第二个请求,直到第一个请求完成 - 最简单的说,你可以把第二个请求的启动放在第一个请求的回调函数中