关于jsonp的同步问题
目录
关于jsonp的同步问题
最近开始移动开发,因json无法跨域请求的问题,选择了以jsonp的形式向服务器传输数据,为使请求以同步方式执行,在ajax参数中加入了async:false,但出现各ajax块返回的数据混乱问题。经查明,jsonp不支持async:false属性。错误的代码块如下:
$.ajax({
url : 'xxx',
data : {
xxx : xxx,
xxx : xxx
},
dataType : 'jsonp',
jsonpCallback : 'callback',
async : false,//此处是jsonp不支持的参数
success : function (data) {
//do something;
}
});
原理:
ajax和jsonp本质上不同。
ajax是通过XMLHttpRequest获取非本页内容,而jsonp核心实质上是通过动态添加script标签调用服务器提供的js脚本。
故jsonp方式只是形式和json相似,本质不同,无法使用async参数。
解决方式:
将要同步执行的jsonp代码块写在执行成功的success方法中。
$.ajax({
url : 'xxx',
data : {
xxx : xxx,
xxx : xxx
},
dataType : 'jsonp',
jsonpCallback : 'callback',
success : function (data) {
//do something;
$.ajax({
url : 'xxx',
data : {
xxx : xxx,
xxx : xxx
},
dataType : 'jsonp',
jsonpCallback : 'callback',
success : function (data) {
//do something;
}
});
}
});