javascript异步返回的问题?

2011-11-27 19:15:45 +08:00
 reducm
想请教大家一个异步返回数据到上层函数,然后再另上层函数返回正确值的问题,例如:

A(){
a="a";
var B = function(b){a=b;};
$.post("url",xxx,b);
return a;
}

假设异步调用B函数时返回的是"b",如何令调用A函数时候获得的是正确的异步结果"b"?
6174 次点击
所在节点    问与答
18 条回复
kojp
2011-11-27 19:24:13 +08:00
菜鸟表示不明白$在此处是神马意思?你用jquery了?
reducm
2011-11-27 19:41:41 +08:00
@kojp 嗯,那是用jquery的ajax来举例
zythum
2011-11-27 19:44:20 +08:00
这个没办法的。
你可以在a函数里写个回调函数。的方法获得b的值。然后做处理。
jidixuelang
2011-11-27 19:46:46 +08:00
B函数执行的时候,A早都已经返回并结束了
你要换个思路
把要做的事情,要返回给谁,都教给B来做
B作为A内部的一个匿名函数,由于闭包的原因,是可以访问A的局部变量的
reducm
2011-11-27 20:07:26 +08:00
@zythum 可以具体点吗?
zythum
2011-11-27 20:10:08 +08:00
var a = function(fn){
$.ajax(success:fn);
}
a(function(data){...});

能看懂么?
zythum
2011-11-27 20:10:53 +08:00
var a = function(fn){
$.ajax({...,success:fn,...});
}
a(function(data){...});
前面的敲错了。
看这个。
ayanamist
2011-11-27 22:30:10 +08:00
楼上的都弄的太麻烦了。其实楼主就是要异步下的同步执行。
推荐一个项目,你肯定喜欢。
https://github.com/JacksonTian/eventproxy
tuoxie007
2011-11-28 11:09:11 +08:00
$.ajax({url:xxx, method:'post', async:false});
liveitm
2011-11-28 11:41:53 +08:00
@tuoxie007 这样已经设置成同步了,当然是可以获取到值的。
darasion
2011-11-28 12:01:24 +08:00
给 A函数传一个回调函数,然后在这个回调函数里处理 “原A函数” 的返回值。

类似这样:

A(callback){
a="a";
$.post("url",xxx,function(ret){
callback(a, ret);
});

}

A(function(a, ret){
a=ret;
});
xi4nyu
2011-11-28 12:14:57 +08:00
同上, 回調方式处理.
keakon
2011-11-28 12:15:26 +08:00
我奇怪的是楼主为什么有这种需求…

就好像你去下载一部电影,下载这个行为是异步的,你却要求点击下载按钮后,随时去检查都可以得到完整的电影内容。

正确的设计不应该是电影下完后通知你下载完毕,可以去看了么?
darasion
2011-11-28 12:48:32 +08:00
@keakon 目前我纠结于:如果下载电影的软件挂了,我该如何发现。
keakon
2011-11-28 13:20:15 +08:00
@darasion onerror、onexit
reducm
2011-11-28 19:31:19 +08:00
@ayanamist 感谢,eventproxy很有意思,之前一个项目也使用过。
@darasion 这个回调嵌套之前也想过,但已有代码已臃肿,这个用的地方也多,现在使用大闭包了事,将来再重写消息传递
@keakon 最近在你博客提问了,感谢你总热心回答各种技术问题!应用场景是一个论坛chrome插件,需要popup从contentjs里头经常获取一个对象,因为有多tab和popup无状态的问题(每次获取tabid都要用异步回调或用background page onSelectionChange保存状态),现在还是用大闭包解决问题,这的确是个同步调用异步问题
darasion
2011-11-29 13:02:16 +08:00
@keakon 呵呵,多谢。我表达有误。这里我说的不是js,都是一大坨坨坨的命令脚本,这个好像挺麻烦。看着都不懂。
keakon
2011-11-29 18:13:07 +08:00
@darasion 命令执行时一般都是同步的啊…根据返回值判断是否正常结束

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/22292

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX