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

Q: JavaScript在一个function中使用ajax请求,如何才能将ajax返回的结果作为function的返回值

  •  
  •   liaa · 2013-12-01 00:13:35 +08:00 · 8060 次点击
    这是一个创建于 4011 天前的主题,其中的信息可能已经有所发展或是发生改变。
    深夜来V2讨教一个问题:

    代码如下:

    ```js
    function loadAllGists(username){
    var gists = null;
    $.ajax({
    url: 'https://api.github.com/users/'+username+'/gists'
    }).done(function(data) {
    console.log('ajax compelete');
    gists = data;
    });
    console.log('function compelete');
    return gists;
    }
    ```

    var gistsOfliaa = loadAllGists('liaa');
    这里我希望gistsOfliaa是 ajax的返回值. 但是因为ajax是异步过程,所以loadAllGists方法返回值是undefined.

    想问下如何才能达到我想要的目的.即:在一个function中使用ajax请求,如何才能将ajax返回的结果作为function的返回值
    12 条回复    1970-01-01 08:00:00 +08:00
    binux
        1
    binux  
       2013-12-01 00:20:17 +08:00
    不可以
    liaa
        2
    liaa  
    OP
       2013-12-01 01:11:03 +08:00
    @binux 好像只有用callback了...
    toctan
        3
    toctan  
       2013-12-01 01:18:23 +08:00 via Android
    @binux @liaa 其实是可以的,ajax 传入 async: false 只是不推荐这样做,这样 ajax call 就是 synchronous 的,会 block
    lizheming
        4
    lizheming  
       2013-12-01 01:18:43 +08:00 via iPad
    改成同步可以么?
    liaa
        5
    liaa  
    OP
       2013-12-01 02:05:26 +08:00
    @toctan 是的这样子只追求代码的简洁会得不偿失...
    binux
        6
    binux  
       2013-12-01 02:29:13 +08:00
    @toctan ajax = Asynchronous JavaScript and XML,那就不叫ajax请求了
    虽然没法直接 var =
    但是callback也可以写得比较简单
    davepkxxx
        7
    davepkxxx  
       2013-12-01 02:36:56 +08:00
    我们公司的做法是async: false
    justfly
        8
    justfly  
       2013-12-01 02:44:37 +08:00
    研究了python异步网络框架tornado,js如果支持生成器(yield),就能搞定同步风格写异步代码,不 block 页面
    justfly
        9
    justfly  
       2013-12-01 02:45:47 +08:00
    但是 js 不支持,所以还要回掉写
    undozen
        10
    undozen  
       2013-12-01 07:15:06 +08:00 via Android
    1. HTTPXmlRequest 可以發同步請求,但請求期間瀏覽器會卡住
    2. 你看看 promise 會不會接近你想要的
    gouflv
        11
    gouflv  
       2013-12-01 09:23:17 +08:00
    callback 或者 promise , 没有其他模式了, async: false一般不会推荐
    rankjie
        12
    rankjie  
       2013-12-01 23:35:07 +08:00 via iPhone
    硬要这样的话。。。那就:
    node --harmony有yield(0.11版本以上就支持了似乎)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2866 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:20 · PVG 17:20 · LAX 01:20 · JFK 04:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.