jquery ajax回调函数是否闭包?或者并发?

wad12302 2012-03-07 09:27:45

<script type="text/javascript">
$(document).ready(function(){
$(":button").click(function(){
$.ajax({
url:'urlxxxxxxxxxxxxx',
success:function(data){
//该方法是不是支持并发?即是否是闭包的?
}
});
});
});
</script>

<script type="text/javascript">
$(document).ready(function(){
$(":button").click(function(){
var dy_id = $(this).attr("id");//这个值是根据点击按钮获取值变动的
$.ajax({
url:'urlxxxxxxxxxxxxx',
//context:xxx 如果不使用context是否也一样可行
success:function(data){
$("#" + dy_id).val(date.value); //关键这个dy_id 是否不会存在以下说的问题?并发以及返回先后顺序

//该方法是不是支持并发?即是否是闭包的?
//那么 我在这了在根据返回结果在根据dy_id进行操作
//如果是并发的那么dy_id值已经改变了
//如:第一次调用时候 dy_id = 1;第二次调用时候时候dy_id = 2.
// 如果第二次先返回,第一次后返回,当第一次后返回时候它再根据dy_id操作的
//时候,这是dy_id的值是 1 还是 2 ? 这个是不是闭包的?还是怎么解释

// 如果不能直接获取上面的dy_id ? 那么怎么获取法?
// 是不是需要使用context:xxx, 设置为上下文.如果不使用context是否也一样可行
}
});
});
});
</script>

...全文
412 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wad12302 2012-03-08
  • 打赏
  • 举报
回复
我说的有点问题。

我说的并发是这个意思:

总共2次点击不同的按钮都触发这个方法的ajax调用。

先是第一次调用 dy_id=1,赶紧点击第二次dy_id=2,但是后台程序只针对第一次的点击睡眠1分钟,而第二次点击立即返回

那么这样 第二次的结果要先于第一次返回

那么回调中的

success:function(data){
这里是第二次先返回:那么 dy_id是等于几?是否第二次的是2 而第一次的是1
}
demonccgg 2012-03-08
  • 打赏
  • 举报
回复
异步的话 抓不到你想要的值

把jquery 的Ajax 改为同步方式试试
jusfr 2012-03-08
  • 打赏
  • 举报
回复
呵呵,完全是一样的效果,如果callbackFn写在click()里边那么就可以访问到变量dy_id,如果写在click之外当然就访问不到了,其他无异。
jusfr 2012-03-08
  • 打赏
  • 举报
回复
看贴的第一感觉是:不知道你想要什么。
[Quote=引用 1 楼 wad12302 的回复:]success:function(data){
//该方法是不是支持并发?即是否是闭包的?
}
[/Quote]
这个并发跟闭包哪里有一毛线的关系?“即”从何来?
[Quote=引用 1 楼 wad12302 的回复:]//context:xxx 如果不使用context是否也一样可行[/Quote]
context参数是上下文,用处有限,看具体需求。
[Quote=引用 1 楼 wad12302 的回复:]如果是并发的那么dy_id值已经改变了[/Quote]
怎么改变的?你的站点是动态的,给每个人的DOM树都不一样,那么每个人根据自己手里的副本发出参数各不相同的Request,所得内容自然是由参数决定的。
如果同一人发出两个异步请求,那么哪个请求先回来是不确定的;但如果多用户各发出异步请求,这与服务器线程有关。
[Quote=引用 1 楼 wad12302 的回复:]这是dy_id的值是 1 还是 2 ?[/Quote]无论你的AJAX的success如何改变DOM树,JS是单线程的,回调也是一个一个执行的。
最后,闭包是什么再去找找,并发什么就算了。
Acesidonu 2012-03-08
  • 打赏
  • 举报
回复
问题比较高深
wad12302 2012-03-08
  • 打赏
  • 举报
回复
来人回复啊
wad12302 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jusfr 的回复:]

看到楼上的回答才有点明白LZ的意思,楼主是觉得,不同的BUTTON都提交ajax请求,因为$(':button')看起来调用了同样的方法,内部都有dy_id 变量,不同的请求都要访问和修改dy_id,担心它的变化?

dy_id 是在click()方法声明的,即为函数作为域,不同的button的click事件有自己版本的dy_id,不干扰的。
[/Quote]

是的我的就是这个意思。

前面的代码是这样写回调函数的:

$.ajax({
url:'urlxxxxxxxxxxxxx',
success:function(data){
//xxxxxx
根据dy_id 操作
}
});

但是还有的写法是这样的:

$.ajax({
url:'urlxxxxxxxxxxxxx',
success:callbackFn;
});


callbackFn(){
///
那么这里怎么根据
dy_id 操作?
}

那么callbackFn 而外定义的和原来定义是不是一样的效果?

如果是而外定义的方法那么dy_id 怎么操作?


jusfr 2012-03-08
  • 打赏
  • 举报
回复
看到楼上的回答才有点明白LZ的意思,楼主是觉得,不同的BUTTON都提交ajax请求,因为$(':button')看起来调用了同样的方法,内部都有dy_id 变量,不同的请求都要访问和修改dy_id,担心它的变化?

dy_id 是在click()方法声明的,即为函数作为域,不同的button的click事件有自己版本的dy_id,不干扰的。
打字员 2012-03-08
  • 打赏
  • 举报
回复
你可以建一个环境试一下啊,向同一个页面发送请求,根椐不同的参数选择是否sleep,人为造成两次完成请求的时间差,返回结果会告诉你答案的


我的看法是:
dy_id都只是局部变量,它们的值在完成ajax请求前后不会变化,因为他们处在两个独立的运行环境中
jusfr 2012-03-08
  • 打赏
  • 举报
回复
我们总是需要在每个ajax请求的回调事件里添加操作DOM文档等逻辑。

对于单个或多个来源分别提交ajax请求,如果逻辑互不干扰,谁先谁后完成不重要;如果逻辑互相干扰,比如请求2需要以请求1的结果作为参数、请求1需要改写了DOM文档等,那么把请求2写入请求1的回调里即可。

请求的来源更加不重要,请求包含head,get请求将信息写在url里,post请求将信息写在body里,服务器根本不关心是哪个button提出的请求,回调函数工作的时候DOM树是什么样子服务器更加不想知道。
jusfr 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wad12302 的回复:]那么dy_id的值已经变化了[/Quote]
怎么变化的?
[Quote=引用 6 楼 wad12302 的回复:]等到第一次结果返回时候呢?还是1吗?[/Quote]
什么还是1?
wad12302 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jusfr 的回复:]
看贴的第一感觉是:不知道你想要什么。

引用 1 楼 wad12302 的回复:success:function(data){
//该方法是不是支持并发?即是否是闭包的?
}

这个并发跟闭包哪里有一毛线的关系?“即”从何来?

引用 1 楼 wad12302 的回复://context:xxx 如果不使用context是否也一样可行
context参数是上下文,用处有限,看具体……
[/Quote]

是单线程的,

但是连续点击很多次,其中某些点击的结果返回顺序打乱了
第一次点击最后才返回等等
那么dy_id的值已经变化了,等到第一次结果返回时候呢?还是1吗?

87,990

社区成员

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

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