在对话框中使用表单我在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,但结果仍然相同。
请帮忙!
答案 0 :(得分:4)
正如Alex所说,异步请求就是这样 - 他们的订单无法保证。如果您想保证他们的订单,您可以 使它们同步。有一个选项sync: true
我认为你可以发送请求args。这会导致浏览器冻结直到请求返回,因此除非您没有其他选项,否则不建议使用,并且请求非常快。
您还可以提交所需的任何数据以及当前请求的数据。例如,假设下拉列表A的值确定下拉列表B中可用的列表选项。而不是在下拉列表A更改时提交更改,然后刷新下拉列表B的选项,您可以做的是在下拉列表B打开时提交A的值,并在确定B的选择的服务器逻辑中处理它。 (这假设您有一个下拉窗口小部件,其中包含服务器生成的选项,而不是标准标记。)
答案 1 :(得分:3)
Ajax中的第一个A代表“异步”,这意味着事情“按照自己的节奏”发生:很可能请求按照您期望的顺序发送,但它们完成反过来只是因为第二个更快。是的,当然你可以等到启动(发送)第二个请求,直到第一个请求完成 - 最简单的说,你可以把第二个请求的启动放在第一个请求的回调函数中