如题,jQuery.ajax为什么不能实现return值?这是因为什么呢?知道原因的大神们都说说吧,谢谢了!
贴上代码大家看看
function IsAdd(year,areaId,subjectId)
{
$.ajax({ type: "POST", url: "/Score/IsAdd", data: { year: year, areaId: areaId, subjectId: subjectId }, dataType: "Json", async: false, //设为false就是同步请求 cache: false, success: function (data) { return data.Result;//data.Result bool类型 } });
}
其实也可以实现return 值的。
var returnValue;
$.ajax({
async:false
}).done(function(data){
returnValue=data;
});
alert(returnValue)
嗯,目前我就是这么做的,但是我不清楚jQuery.ajax为什么不能实现return值,大神能帮我解释一下原理吗?
.done和直接在success里面写有什么区别?
@晓菜鸟: 没什么区别,只不过设置sucess是旧的使用方式,属于过期用法。
@晓菜鸟: 为什么不能return值,从两点上考虑。
1是异步,2是作用域。、首先异步,决定了done之中的代码可能会比后续代码后执行,所以return就变得无意义了。
如果在参数中,将请求设置为了同步,那么从代码执行顺序上,是满足了返回值这样一个条件(先执行done中的代码,再执行后续),但是由于done/success是一个函数,由于js中每个函数都会有自己的作用域,所以,产生了跨作用域的返回,导致我们上层函数不能直接接受done的返回值。不过由于ajax请求每次都会执行complete,所以这个的返回值是能接受到的。
var responeObj=$.ajax({url:'',async:false;}).complete(function(res){return res;});
@幻天芒: 谢谢,受教了。
@晓菜鸟: :),只是个人理解。
@幻天芒: :) 宝贵的经验.
@幻天芒: 不太懂为什么done和success是一个函数,范围应该也是一样的,为什么使用done可以返回,success就不能返回
@生命礼赞: done也不能返回哇。complete也只有当异步为false的时候才能返回的 。
@幻天芒: 明白了,done里面的返回值也接收不到,在这个校验中,要定义一个上层的变量来记录,同时Ajax要设置同步,只要满足这两个就可以了,和success实现还是done实现没有关系。
@生命礼赞: Yes~
不能实现return值。?什么意思
就是回调方法里面写return不起作用。
@晓菜鸟: 可以return 不过return是return到调用success这个函数那里。如果你想保存data的话,建议声明一个全局变量什么的保存吧
@咦?: 嗯,目前就是这么做的。
因为它是异步的,异步只能回调
我设置成同步的也不行。
如果有返回值,那就是同步请求。ajax是通过异步方式增强用户体验性。
我设置成同步也没有返回值。
@晓菜鸟: 不妨贴代码看看。最好方式还是通过回调
@lucika.zh: 请看问题补充。
@晓菜鸟: 这样只能确保在ajax函数体内,也就是IsAdd保证是同步的,阻塞的。但是调用函数的时候确不会等待,而是立即返回。
@lucika.zh: 谢谢回答,受教了。
异步调用,实现return很麻烦。
你的实现里的return,那么你return后的结果给谁呢?success函数是ajax系统机制调用的,当访问成功后调用success方法,而什么时候访问成功是一个未知数,故不可以。
要想实现同步,你需要去修改ajax的调用机制,这个嘛,得不偿失。
不要在这里纠结这个情状了,而你,如果要想实现同步,应该是:
var callOk = false;
var result;
ajax({success:function(data){result = data; callOk = true;}});
while(!callOk)
{
sleep(100);//此处延时一段时间,我没花时间去考虑延时,只用伪码表示
}
//调用成功,处理结果
doResult();
谢谢回答,受教了。