2 wild84 wild84 于 2017.09.11 11:42 提问

ajax请求获得的数据如何传递给外部变量?

请问cnname如何能获取到json.cnname的值?

 function findTypeName(id){
    var cnname;
    $.ajax({
        url:urlheader+"selectTypeById.html",
        data:{id:id},
        datatype:"json",
        success:function(data){
            var json = eval('(' + data + ')');
            console.log(json);
            cnname=json.cnname;
        }
    });
    return cnname;
}

10个回答

jessiejessie_zhou
jessiejessie_zhou   2017.09.11 11:54
已采纳

你ajax要用同步的就可以了
如:
$.ajax({
url: "some.php",
async: false
});

wangnl_okay
wangnl_okay 把异步改同步,但是这样的话,ajax的异步初衷就没有任何意义了。解决的一个办法就是利用面向对象的方式。可以将ajax返回的值存储在对象的属性中,在对象的方法里处理数据。(ajax异步获取和处理都是在对象里进行)
2 个月之前 回复
wild84
wild84 用你的方法可以,但是jquery不支持这样做,报了个警告,还有没有其他方法?
2 个月之前 回复
Small_Mouse0
Small_Mouse0   Ds   Rxr 2017.09.11 11:51

这样不能赋值??

感觉是json.cnname,,没获取到,

Small_Mouse0
Small_Mouse0 回复wild84: return cnname;,,放到success里面行不行,,
2 个月之前 回复
wild84
wild84 json.cnname有获取到,已经alert()出来了
2 个月之前 回复
qq_38005982
qq_38005982   2017.09.11 11:53

应该是已经得到了,你尝试不要return先alert一下,看看有没有值,你确定json.cnname有值么?

wild84
wild84 json.cnname有值,alert()过,后来删了
2 个月之前 回复
qq_33727653
qq_33727653   2017.09.11 12:22

由于是异步的, cnname=json.cnname这个肯定能赋值成功,但是用return 就不合适了,因为异步的原因,一般会先return 了后有 cnname=json.cnname赋值,所以楼主的return没有用!要么改成同步,要么看楼主的需求具体是什么,更改代码!

wild84
wild84 大概了解出异常的原因.我的需求是外部调用这个函数时给一个类型id,这个函数返回数据库取出的类型名称?请教具体怎么改?
2 个月之前 回复
q213546879
q213546879   2017.09.11 12:37

这是一个变量的作用域问题,解决的方法有几个,
第一,把需要cnname这个变量的函数放到success里面去执行,然后以传参的方式把cnname传过去就好了
第二,把cnname设为全局变量,并且在success里面做一个开关,实时监测success状态,只有成功之后再去调用cnname这个变量

zhwyj1019
zhwyj1019   2017.09.11 12:49

JS是单线程的,会先走完主函数findTypeName(id),再去走$.ajax();所以没有获取到值,这种队列模式造成了异步的假象,其实是先走主函数,然后遇到了$.ajax();会让$.ajax();选择合适的时机添加到队列中等待执行,主函数执行完之后,再去队列中执行执行等待的队列,就算设置了$.ajax()立即进去队列,也不会马上执行,还是要先走完主函数。

zhwyj1019
zhwyj1019 回复wild84: 两种方法:1、在回调函数加上async:false;2、回调函数中还可以写函数,不需要返回,直接在回调函数中写你需要做的其他功能
2 个月之前 回复
wild84
wild84 那么这种情况怎解决呢?如何让它先走ajax的回调函数?
2 个月之前 回复
zhwyj1019
zhwyj1019 刚刚我测试了一下,你分别在主函数的最后中alert(cnname),和回调函数中alert(cnname),先弹出的undefined,再弹出你获取到的cnname的值,证明了先走的是主函数
2 个月之前 回复
usecf
usecf   2017.09.11 13:01

在js里面加个$.ajaxSetup({
async : false
});

qq_40190239
qq_40190239   2017.09.11 15:18

可以根据id获或者class获取
id获取的方法是$("id").val()
class的方法是$(".classid").val()

huang931027
huang931027   2017.09.11 17:07

你想把值传到外部 cnname在声明的时候在方法外面声明,在你的方法里面直接赋值就能传递了

qq_37467401
qq_37467401   2017.09.11 18:00

ajax本来是异步的,像服务器发送异步的请求之后,不等服务器的,可以换个写法。

Csdn user default icon
上传中...
上传图片
插入图片