reducm
V2EX  ›  问与答

javascript异步返回的问题?

  •  
  •   reducm · Nov 27, 2011 · 7518 views
    This topic created in 5464 days ago, the information mentioned may be changed or developed.
    想请教大家一个异步返回数据到上层函数,然后再另上层函数返回正确值的问题,例如:

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

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

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

    类似这样:

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

    }

    A(function(a, ret){
    a=ret;
    });
    xi4nyu
    xi4nyu
    Nov 28, 2011
    12
    同上, 回調方式处理.
    keakon
    keakon
    Nov 28, 2011
    13
    我奇怪的是楼主为什么有这种需求…

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

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