先上部分代码,点击按钮后根据在浏览器器调试,最后执行顺序如代码中的注释顺序
$(function () {
$("#btnsure").on('click', function () {
var deviceinfo = getdeviceinfo();
debugger; //第三步,getdeviceinfo()方法调用完,返回的值为空
})
})
function getdeviceinfo() {
debugger;//第一步,断点先执行到这里,第二步直接就跳过ajax请求
var deviceinfo = { Model: "", Build: "", sysVersion: "", OS: "", fing: "", city: "" };
//获取当前城市信息
$.ajax({
url: 'https://api.map.baidu.com/location/ip?ak=VV??????????????&coor=bd09ll',
type: 'POST',
dataType: 'jsonp',
timeout: 2000,
async: false,
success: function (json) {
debugger; //,第四步,在前面onclick的事件执行完之后才中这个断点,正确返回了需要的数据
deviceinfo.city = json.content.address;
//此处省略其他代码
},
error: function (e) {
layer.open({ content: '错误!请刷新!', skin: 'msg', time: 2 })
},
complete: function (XMLHttpRequest, status) {
if (status == 'timeout') {
layer.open({ content: '网络不稳定,请求超时!', skin: 'msg', time: 2 })
}
}
})
debugger;//第二步,跳过了ajax请求
return deviceinfo;
}
所以,这是为什么呢,为什么不能调用了方法结果却不能执行请求返回数据
$(function () {
$("#btnsure").on('click', function () {
var deviceinfo = getdeviceinfo();
debugger; //第三步,getdeviceinfo()方法调用完,返回的值为空
})
})
function getdeviceinfo() {
debugger;//第一步,断点先执行到这里,第二步直接就跳过ajax请求
var deviceinfo = { Model: "", Build: "", sysVersion: "", OS: "", fing: "", city: "" };
//获取当前城市信息
$.ajax({
url: 'https://api.map.baidu.com/location/ip?ak=VV??????????????&coor=bd09ll',
type: 'POST',
dataType: 'jsonp',
timeout: 2000,
async: false,
success: function (json) {
debugger; //,第四步,在前面onclick的事件执行完之后才中这个断点,正确返回了需要的数据
deviceinfo.city = json.content.address;
//此处省略其他代码
},
error: function (e) {
layer.open({ content: '错误!请刷新!', skin: 'msg', time: 2 })
},
complete: function (XMLHttpRequest, status) {
if (status == 'timeout') {
layer.open({ content: '网络不稳定,请求超时!', skin: 'msg', time: 2 })
}
}
})
debugger;//第二步,跳过了ajax请求
return deviceinfo;
}
所以,这是为什么呢,为什么不能调用了方法结果却不能执行请求返回数据
2 是没有成功加载jquery库,但是如果jquery没有成功加载,那么$(function(){})又怎么会起作用呢,按钮的点击事件也应该不能响应啊,既然执行到了onclick事件里面,那么jquery库应该是执行成功了的,
所以,还有什么原因吗
$(function () {
$("#btnsure").on('click', async function () {
var deviceinfo = await getdeviceinfo();
debugger; //第三步,getdeviceinfo()方法调用完,返回的值为空
})
})
function getdeviceinfo() {
retrun new Promise((rs,rj) => {
debugger;//第一步,断点先执行到这里,第二步直接就跳过ajax请求
var deviceinfo = { Model: "", Build: "", sysVersion: "", OS: "", fing: "", city: "" };
//获取当前城市信息
$.ajax({
url: 'https://api.map.baidu.com/location/ip?ak=VV??????????????&coor=bd09ll',
type: 'POST',
dataType: 'jsonp',
timeout: 2000,
async: false,
success: function (json) {
rs(json)
debugger; //,第四步,在前面onclick的事件执行完之后才中这个断点,正确返回了需要的数据
deviceinfo.city = json.content.address;
//此处省略其他代码
},
error: function (e) {
layer.open({ content: '错误!请刷新!', skin: 'msg', time: 2 })
},
complete: function (XMLHttpRequest, status) {
if (status == 'timeout') {
layer.open({ content: '网络不稳定,请求超时!', skin: 'msg', time: 2 })
}
}
})
debugger;//第二步,跳过了ajax请求
return deviceinfo;
})
}
$("#btnsure").on('click', async function () {
var deviceinfo = await getdeviceinfo();
debugger; //第三步,getdeviceinfo()方法调用完,返回的值为空
})
})
function getdeviceinfo() {
return new Promise((rs,rj) => {
debugger;//第一步,断点先执行到这里,第二步直接就跳过ajax请求
var deviceinfo = { Model: "", Build: "", sysVersion: "", OS: "", fing: "", city: "" };
//获取当前城市信息
$.ajax({
url: 'https://api.map.baidu.com/location/ip?ak=VV??????????????&coor=bd09ll',
type: 'POST',
dataType: 'jsonp',
timeout: 2000,
async: false,
success: function (json) {
debugger; //,第四步,在前面onclick的事件执行完之后才中这个断点,正确返回了需要的数据
deviceinfo.city = json.content.address;
//此处省略其他代码
rs(deviceinfo) //此处传什么 await接收到的就是什么
},
error: function (e) {
layer.open({ content: '错误!请刷新!', skin: 'msg', time: 2 })
},
complete: function (XMLHttpRequest, status) {
if (status == 'timeout') {
layer.open({ content: '网络不稳定,请求超时!', skin: 'msg', time: 2 })
}
}
})
debugger;//第二步,跳过了ajax请求
// return deviceinfo; 不需要return
})
}
另外 var deviceinfo = await getdeviceinfo();这样直接使用会报错,提示"必须是;"也就是await后面不能跟函数?