Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax调用不是同步发生的_Javascript_Jquery_Json_Ajax - Fatal编程技术网

Javascript Ajax调用不是同步发生的

Javascript 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

我用Ajax调用了一个带有一些参数的IP
在执行重要的调用(让我们调用“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);
    }
});