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

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

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


    今天下午看到的
    ffffwh
        3
    ffffwh  
       2014-10-27 21:19:46 +08:00
    first-class continuation?
    ttph1oc
        4
    ttph1oc  
       2014-10-27 21:23:06 +08:00
    听说Q是很好的,不过我也没有真的试过。
    jybox
        5
    jybox  
       2014-10-27 21:51:53 +08:00
    快上 Coffee 贼船
    ChanneW
        6
    ChanneW  
    OP
       2014-10-27 22:06:38 +08:00
    $.when(
    $.ajax( "/main.php" ),
    ).then( successFunc(){
    $.when(
    $.ajax( "/333.php" ),
    ).then( Func2(){
    });
    });


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

    不过没有啥完美的方案,js就这屌样
    walkingway
        10
    walkingway  
       2014-10-27 23:01:57 +08:00
    aisk
        11
    aisk  
       2014-10-27 23:03:52 +08:00
    promise
    imskull
        12
    imskull  
       2014-10-27 23:18:49 +08:00
    一直用Q挺爽。
    luin
        13
    luin  
       2014-10-28 01:17:35 +08:00   ❤️ 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 01:37:55 +08:00 via iPhone
    publish-subscribe pattern
    Epsil0n9
        15
    Epsil0n9  
       2014-10-28 04:35:21 +08:00
    @walkingway 请问这个客户端的名字,两个旋转的箭头设计很带感
    zhyu
        16
    zhyu  
       2014-10-28 08:39:22 +08:00
    Q挺好的,后来遇到了bluebird,据说性能比Q好很多(
    showhand
        17
    showhand  
       2014-10-28 08:46:01 +08:00 via Android
    fibjs?
    walkingway
        18
    walkingway  
       2014-10-28 08:47:41 +08:00
    @Epsil0n9 官方web呀,原生Retweet就是这样的
    wanjun
        19
    wanjun  
       2014-10-28 09:26:27 +08:00
    国人开发的 fibjs,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2899 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:07 · PVG 22:07 · LAX 06:07 · JFK 09:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.