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

怎么能把 js 的异步流程写得像同步.

  •  
  •   ChanneW · 2014 年 10 月 27 日 · 4122 次点击
    这是一个创建于 4112 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看到这里有一篇文章 http://huangj.in/765 ,也想实现这样的效果. 但是我不做 nodejs , 我用在纯粹的浏览器里,有没有类似的方法.
    19 条回复    2014-10-28 09:26:27 +08:00
    chemzqm
        1
    chemzqm  
       2014 年 10 月 27 日
    chrome可以手工开启generator,要兼容的话 promise 凑合用吧
    walkingway
        2
    walkingway  
       2014 年 10 月 27 日   ❤️ 1


    今天下午看到的
    ffffwh
        3
    ffffwh  
       2014 年 10 月 27 日
    first-class continuation?
    ttph1oc
        4
    ttph1oc  
       2014 年 10 月 27 日
    听说Q是很好的,不过我也没有真的试过。
    jybox
        5
    jybox  
       2014 年 10 月 27 日
    快上 Coffee 贼船
    ChanneW
        6
    ChanneW  
    OP
       2014 年 10 月 27 日
    $.when(
    $.ajax( "/main.php" ),
    ).then( successFunc(){
    $.when(
    $.ajax( "/333.php" ),
    ).then( Func2(){
    });
    });


    感觉 jquery 的 when - then 就是把回调函数拿到面前来了, 最终我还是会写成一大堆的嵌套, 何解?
    Mutoo
        7
    Mutoo  
       2014 年 10 月 27 日
    async.js 就挺好用。
    egen
        8
    egen  
       2014 年 10 月 27 日 via iPhone
    wind.js
    NathanInMac
        9
    NathanInMac  
       2014 年 10 月 27 日
    async.js +1

    不过没有啥完美的方案,js就这屌样
    walkingway
        10
    walkingway  
       2014 年 10 月 27 日
    aisk
        11
    aisk  
       2014 年 10 月 27 日
    promise
    imskull
        12
    imskull  
       2014 年 10 月 27 日
    一直用Q挺爽。
    luin
        13
    luin  
       2014 年 10 月 28 日   ❤️ 1
    @walkingway 多谢推荐!

    好巧,我这两天刚写了一个解决 JavaScript 异步的方案,是通过语法分析 + generator 实现的。可以在开发时彻底不用关心异步问题,用起来很简单,也不用 async.js 这样的异步流程控制类库。

    GitHub 上有个比较直观好懂的示例:
    https://github.com/luin/teascript

    再举个常见的例子是:

    User.findById(15, function(err, user) {
    if (user) {
    user.getProjects(function(err, projects) {
    res.json({ user: user, projects: projects });
    });
    } else {
    res.status(404).json({ error: 'not found' });
    }
    });

    可以用 TeaScript 改成:

    var user = User.findById(15, ~);
    if (user) {
    res.json({ user: user, projects: user.getProjects(~) });
    } else {
    res.status(404).json({ error: 'not found' });
    }

    目前这个项目还比较阳春,我还在抓紧完善。准备在我的下个项目中用上它,请大家多多提意见提交代码和 Star ^^

    ---

    因为 TeaScript 用了 generator,所以目前来看只能在 Node 上用。如果楼主是前端的话,还是用 Promise 和 async.js 比较好,重一点的 IcedCoffeeScript 也可以,不过不用 generator 的话确实很难有完美的方案。
    gangsta
        14
    gangsta  
       2014 年 10 月 28 日 via iPhone
    publish-subscribe pattern
    Epsil0n9
        15
    Epsil0n9  
       2014 年 10 月 28 日
    @walkingway 请问这个客户端的名字,两个旋转的箭头设计很带感
    zhyu
        16
    zhyu  
       2014 年 10 月 28 日
    Q挺好的,后来遇到了bluebird,据说性能比Q好很多(
    showhand
        17
    showhand  
       2014 年 10 月 28 日 via Android
    fibjs?
    walkingway
        18
    walkingway  
       2014 年 10 月 28 日
    @Epsil0n9 官方web呀,原生Retweet就是这样的
    wanjun
        19
    wanjun  
       2014 年 10 月 28 日
    国人开发的 fibjs,
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   946 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:49 · PVG 04:49 · LAX 12:49 · JFK 15:49
    ♥ Do have faith in what you're doing.