V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
reducm
V2EX  ›  问与答

javascript异步返回的问题?

  •  
  •   reducm · 2011-11-27 19:15:45 +08:00 · 6232 次点击
    这是一个创建于 4749 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想请教大家一个异步返回数据到上层函数,然后再另上层函数返回正确值的问题,例如:

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

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

    能看懂么?
    zythum
        7
    zythum  
       2011-11-27 20:10:53 +08:00
    var a = function(fn){
    $.ajax({...,success:fn,...});
    }
    a(function(data){...});
    前面的敲错了。
    看这个。
    ayanamist
        8
    ayanamist  
       2011-11-27 22:30:10 +08:00
    楼上的都弄的太麻烦了。其实楼主就是要异步下的同步执行。
    推荐一个项目,你肯定喜欢。
    https://github.com/JacksonTian/eventproxy
    tuoxie007
        9
    tuoxie007  
       2011-11-28 11:09:11 +08:00
    $.ajax({url:xxx, method:'post', async:false});
    liveitm
        10
    liveitm  
       2011-11-28 11:41:53 +08:00
    @tuoxie007 这样已经设置成同步了,当然是可以获取到值的。
    darasion
        11
    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
        12
    xi4nyu  
       2011-11-28 12:14:57 +08:00
    同上, 回調方式处理.
    keakon
        13
    keakon  
       2011-11-28 12:15:26 +08:00
    我奇怪的是楼主为什么有这种需求…

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

    正确的设计不应该是电影下完后通知你下载完毕,可以去看了么?
    darasion
        14
    darasion  
       2011-11-28 12:48:32 +08:00
    @keakon 目前我纠结于:如果下载电影的软件挂了,我该如何发现。
    keakon
        15
    keakon  
       2011-11-28 13:20:15 +08:00
    @darasion onerror、onexit
    reducm
        16
    reducm  
    OP
       2011-11-28 19:31:19 +08:00 via Android
    @ayanamist 感谢,eventproxy很有意思,之前一个项目也使用过。
    @darasion 这个回调嵌套之前也想过,但已有代码已臃肿,这个用的地方也多,现在使用大闭包了事,将来再重写消息传递
    @keakon 最近在你博客提问了,感谢你总热心回答各种技术问题!应用场景是一个论坛chrome插件,需要popup从contentjs里头经常获取一个对象,因为有多tab和popup无状态的问题(每次获取tabid都要用异步回调或用background page onSelectionChange保存状态),现在还是用大闭包解决问题,这的确是个同步调用异步问题
    darasion
        17
    darasion  
       2011-11-29 13:02:16 +08:00
    @keakon 呵呵,多谢。我表达有误。这里我说的不是js,都是一大坨坨坨的命令脚本,这个好像挺麻烦。看着都不懂。
    keakon
        18
    keakon  
       2011-11-29 18:13:07 +08:00
    @darasion 命令执行时一般都是同步的啊…根据返回值判断是否正常结束
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1422 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:29 · PVG 01:29 · LAX 09:29 · JFK 12:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.