首页 新闻 会员 周边

jQuery.ajax为什么不能实现return值?

0
[已解决问题] 解决于 2014-09-02 14:32

如题,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类型     }   });
}
晓菜鸟的主页 晓菜鸟 | 老鸟四级 | 园豆:2594
提问于:2014-09-02 11:53
< >
分享
最佳答案
0

其实也可以实现return 值的。

var returnValue;

$.ajax({

  async:false

}).done(function(data){

  returnValue=data;

});

alert(returnValue)

奖励园豆:5
幻天芒 | 高人七级 |园豆:37175 | 2014-09-02 12:28

嗯,目前我就是这么做的,但是我不清楚jQuery.ajax为什么不能实现return值,大神能帮我解释一下原理吗?

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 13:25

.done和直接在success里面写有什么区别?

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 13:51

@晓菜鸟: 没什么区别,只不过设置sucess是旧的使用方式,属于过期用法。

幻天芒 | 园豆:37175 (高人七级) | 2014-09-02 14:05

@晓菜鸟: 为什么不能return值,从两点上考虑。

1是异步,2是作用域。、首先异步,决定了done之中的代码可能会比后续代码后执行,所以return就变得无意义了。

如果在参数中,将请求设置为了同步,那么从代码执行顺序上,是满足了返回值这样一个条件(先执行done中的代码,再执行后续),但是由于done/success是一个函数,由于js中每个函数都会有自己的作用域,所以,产生了跨作用域的返回,导致我们上层函数不能直接接受done的返回值。不过由于ajax请求每次都会执行complete,所以这个的返回值是能接受到的。

var responeObj=$.ajax({url:'',async:false;}).complete(function(res){return res;});

幻天芒 | 园豆:37175 (高人七级) | 2014-09-02 14:16

@幻天芒: 谢谢,受教了。

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 14:28

@晓菜鸟: :),只是个人理解。

幻天芒 | 园豆:37175 (高人七级) | 2014-09-02 14:31

@幻天芒: :)  宝贵的经验.

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 14:32

@幻天芒: 不太懂为什么done和success是一个函数,范围应该也是一样的,为什么使用done可以返回,success就不能返回

生命礼赞 | 园豆:200 (初学一级) | 2016-04-28 11:06

@生命礼赞: done也不能返回哇。complete也只有当异步为false的时候才能返回的 。

幻天芒 | 园豆:37175 (高人七级) | 2016-04-28 11:34

@幻天芒: 明白了,done里面的返回值也接收不到,在这个校验中,要定义一个上层的变量来记录,同时Ajax要设置同步,只要满足这两个就可以了,和success实现还是done实现没有关系。

生命礼赞 | 园豆:200 (初学一级) | 2016-04-28 11:52

@生命礼赞: Yes~

幻天芒 | 园豆:37175 (高人七级) | 2016-04-28 13:00
其他回答(4)
0

不能实现return值。?什么意思

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-09-02 12:21

就是回调方法里面写return不起作用。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 13:21

@晓菜鸟: 可以return 不过return是return到调用success这个函数那里。如果你想保存data的话,建议声明一个全局变量什么的保存吧

@咦?: 嗯,目前就是这么做的。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 14:29
0

因为它是异步的,异步只能回调

l4wl137 | 园豆:274 (菜鸟二级) | 2014-09-02 12:23

我设置成同步的也不行。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 13:22
0

如果有返回值,那就是同步请求。ajax是通过异步方式增强用户体验性。

lucika.zh | 园豆:62 (初学一级) | 2014-09-02 13:17

我设置成同步也没有返回值。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 13:25

@晓菜鸟: 不妨贴代码看看。最好方式还是通过回调

支持(0) 反对(0) lucika.zh | 园豆:62 (初学一级) | 2014-09-02 13:31

@lucika.zh: 请看问题补充。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 13:37

@晓菜鸟: 这样只能确保在ajax函数体内,也就是IsAdd保证是同步的,阻塞的。但是调用函数的时候确不会等待,而是立即返回。

支持(0) 反对(0) lucika.zh | 园豆:62 (初学一级) | 2014-09-02 13:54

@lucika.zh: 谢谢回答,受教了。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 14:33
0

异步调用,实现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();

519740105 | 园豆:5810 (大侠五级) | 2014-09-02 13:49

谢谢回答,受教了。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-02 14:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册