Javascript Ajax调用不是同步发生的
我用Ajax调用了一个带有一些参数的IPJavascript Ajax调用不是同步发生的,javascript,jquery,json,ajax,Javascript,Jquery,Json,Ajax,我用Ajax调用了一个带有一些参数的IP在执行重要的调用(让我们调用“call 2”)之前,它必须进行Ajax调用以获取sessionId(让我们调用“call 1”)。sessionId是对IP进行任何调用并使其处理参数所必需的 但是,当我的函数位于彼此下方时,它首先“调用2”,然后“调用1”经典的异步行为,但由于在Ajax调用中我说async:false,我真的不明白为什么它不做我说它必须做的事情 完成Ajax调用“调用1”: 和Ajax调用“调用2”: 假设变量sessionid将sess
在执行重要的调用(让我们调用“call 2”)之前,它必须进行Ajax调用以获取sessionId(让我们调用“call 1”)。sessionId是对IP进行任何调用并使其处理参数所必需的
但是,当我的函数位于彼此下方时,它首先“调用2”,然后“调用1”
经典的异步行为,但由于在Ajax调用中我说
async:false
,我真的不明白为什么它不做我说它必须做的事情
完成Ajax调用“调用1”:和Ajax调用“调用2”: 假设变量sessionid将sessionid提供给“call2”。
如您所见,返回了一个json字符串
我现在所做的是,下一个Ajax调用只有在第一个Ajax调用成功执行时才被初始化和执行。对我来说,这似乎是一种变通方法,而不是一种完成我试图完成的事情的适当方式 将var sessionid定义为全局变量,并在ajax call1中为其赋值,然后在call2中访问该值
var sessionid='';
Url = "_ip_?action=getsessionid";
$.ajax({
url: Url,
type: "Post",
dataType: "jsonp",
async: false,
success: function( json ){
var j = $.parseJSON(json);
sessionid = j['sessionId'];
},
error: function( errorThrown ) {
console.log(errorThrown);
}
});
从JQuery.ajax文档: 跨域请求和数据类型:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从jQuery1.8开始,不推荐在jqXHR($.Deferred)中使用async:false;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()
用这个。我的解决方案是在success函数中发出下一个ajax请求。JQuery文档对此做了更多解释 你真的应该检查这个特定的需求。因为同步ajax是一种不好的做法,可能您的浏览器不再这样做了。您可以为Call 2创建函数,并使用sessionid作为参数从Call 1的成功调用它…@RafaelGuerreiro现在我再次查看ajax文档,它已经改变了。“从jQuery 1.8开始,不推荐在jqXHR($.Deferred)中使用async:false;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,如jqXHR.done()或不推荐的jqXHR.success()。谢谢
编辑:它说像我正在使用的“jsonp”这样的跨域请求不支持同步操作。正如我在问题中所说的,它确实会先调用2,然后再调用1。但是变量在调用1中得到一个值。所以在调用2中它没有变量,什么也不会发生。它没有得到值,因为您在调用一中定义了它。所以你必须全局地定义这个变量,这样你就可以在call2中使用它,它会在call1中分配一个值,只是引用我自己的话“假设变量sessionid确实将sessionid赋予了“call2”。“在第一种情况下,这不是问题所在。Tho,我发现了问题所在。找到了解决办法
Url = "_ip_?action=action&sessionId=" + sessionid;
$.ajax({
url: Url,
type: "Post",
dataType: "jsonp",
async: false,
success: function( json ){
var j = JSON.parse(json);
//do something with j
},
error: function( errorThrown ) {
console.log(errorThrown);
}
});
var sessionid='';
Url = "_ip_?action=getsessionid";
$.ajax({
url: Url,
type: "Post",
dataType: "jsonp",
async: false,
success: function( json ){
var j = $.parseJSON(json);
sessionid = j['sessionId'];
},
error: function( errorThrown ) {
console.log(errorThrown);
}
});