js函数调用另一个函数A,A中有一个ajax请求,但是不是ajax不执行

不知世事深浅 2018-10-09 07:20:53
先上部分代码,点击按钮后根据在浏览器器调试,最后执行顺序如代码中的注释顺序
$(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;
}

所以,这是为什么呢,为什么不能调用了方法结果却不能执行请求返回数据
...全文
672 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
風灬雲 2018-10-10
  • 打赏
  • 举报
回复
借用3楼的代码,

$(function () {
$("#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
})
}
cn00439805 2018-10-10
  • 打赏
  • 举报
回复

$(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;
    })
}
winzond 2018-10-10
  • 打赏
  • 举报
回复
引用 5 楼 qq_36439806 的回复:
[quote=引用 2 楼 winzond 的回复:]
jQuery不会阻塞后面的语句运行,ajax需要一定的时间,数据还没返回,已经执行下一条语句了,当然得不到返回值。如果一定要获取返回的数据,只能使用回调函数,在success里获取。是否与这个有关系?

照你这样改了之后倒是可以完成需求,但是就是这个方法几个地方需要使用,这样改了每次用就得再写一次,想着这样写成一个function在js文件里面可以方便调用,结果会跳过[/quote]我看你并没有带参数,说明每次调用都是执行相同的操作,那么能不能把click事件的后续操作,交给回调函数来做呢?在回搞函数里判断是谁click了,该执行什么样的操作
風灬雲 2018-10-10
  • 打赏
  • 举报
回复
不是说不能是函数;函数要返回一个promise,这样的话await才会去等promise中成功或者失败的回调传过来的参数;如果函数不返回一个promise,await也就没有意义了,直接取函数返回的结果就可以了;仔细检查一下,应该是别的地方出错了
不知世事深浅 2018-10-10
  • 打赏
  • 举报
回复
引用 4 楼 qq_41114603 的回复:
借用3楼的代码,

$(function () {
    $("#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
    })
}
对于三楼四楼的回复,对于我而言倒是新的东西了,没有这样使用过,不太会await的用法,await后面是不是得跟Promise才可以啊? 另外 var deviceinfo = await getdeviceinfo();这样直接使用会报错,提示"必须是;"也就是await后面不能跟函数?
不知世事深浅 2018-10-10
  • 打赏
  • 举报
回复
引用 2 楼 winzond 的回复:
jQuery不会阻塞后面的语句运行,ajax需要一定的时间,数据还没返回,已经执行下一条语句了,当然得不到返回值。如果一定要获取返回的数据,只能使用回调函数,在success里获取。是否与这个有关系?
照你这样改了之后倒是可以完成需求,但是就是这个方法几个地方需要使用,这样改了每次用就得再写一次,想着这样写成一个function在js文件里面可以方便调用,结果会跳过
winzond 2018-10-09
  • 打赏
  • 举报
回复
jQuery不会阻塞后面的语句运行,ajax需要一定的时间,数据还没返回,已经执行下一条语句了,当然得不到返回值。如果一定要获取返回的数据,只能使用回调函数,在success里获取。是否与这个有关系?
不知世事深浅 2018-10-09
  • 打赏
  • 举报
回复
先网上查了半天,发现这种情况比较少,综合来看两个方面的问题,1是ajax同步异步请求的问题,于是我把异步关闭了, 2 是没有成功加载jquery库,但是如果jquery没有成功加载,那么$(function(){})又怎么会起作用呢,按钮的点击事件也应该不能响应啊,既然执行到了onclick事件里面,那么jquery库应该是执行成功了的, 所以,还有什么原因吗

87,989

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧