V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WildCat
V2EX  ›  Node.js

求分析 Async, Promise, EventProxy 优劣,哪个更适合服务端用来减少回调

  •  
  •   WildCat · 2014-05-10 23:53:18 +08:00 via iPhone · 6014 次点击
    这是一个创建于 3834 天前的主题,其中的信息可能已经有所发展或是发生改变。
    13 条回复    2014-05-19 11:07:13 +08:00
    leojoy710
        1
    leojoy710  
       2014-05-11 00:12:40 +08:00   ❤️ 1
    promise的最直观的好处是, 可以拿到一个"返回值"...
    rekey
        2
    rekey  
       2014-05-11 02:13:02 +08:00   ❤️ 1
    个人感觉async和promise不相上下。eventProxy用不惯。可能是实在不知道怎么命名。
    andyhu
        3
    andyhu  
       2014-05-11 02:18:25 +08:00   ❤️ 1
    async执行效率好些,promise更方面和强大些
    bolasblack
        4
    bolasblack  
       2014-05-11 16:30:45 +08:00   ❤️ 1
    嗯,反正 ES6 会自带一个 Promise 对象,所以 Promise 多了解一些应该没有坏处,剩下的你哪个用着比较习惯就用哪个
    coolicer
        5
    coolicer  
       2014-05-15 10:09:43 +08:00
    promise对应的是Q那个库?
    andyhu
        6
    andyhu  
       2014-05-18 04:31:09 +08:00   ❤️ 1
    @andyhu 更新下观点,最近用async又做了很多东西,发现async功能也非常强大,只是可能多数时候promise更直观点,所以都差不多吧,不过也是不习惯event proxy
    andyhu
        7
    andyhu  
       2014-05-19 06:06:56 +08:00
    再更新下,又有些新的发现,看下下面的performance对比图吧,看了下bluebird和ES6 promise polyfill不错,语法都大同小异,但性能略微有差别,代码在这个测试里也有
    http://jsperf.com/promise-comparisons/105
    另外这篇文章介绍了各种不同的方式也有各自优劣对比
    http://blog.namangoel.com/dealing-with-callback-hell
    文章里最后介绍的Reactive programming也有点意思
    andyhu
        8
    andyhu  
       2014-05-19 06:07:31 +08:00
    andyhu
        9
    andyhu  
       2014-05-19 06:17:44 +08:00
    再次更新:
    之前讲的async效率好些,是针对q promise和绝大多数promise的实现,但是刚看了hacker news上的评论, 有人测试了下好像bluebird比async还快,内存占用也更低。另外我用async做一个比较复杂的东西的时候,发现虽然功能很强,但还是很麻烦代码会变得不容易理解和修改,很不直观。如果promise执行效率比async快的话,还是推荐promise。以后ES6 promise也是内置的了,代码迁移会方便很多。而async方式要想重构代码会比较麻烦。

    https://news.ycombinator.com/item?id=6494622

    file time(ms) memory(MB)
    promiseishBluebird.js 1076 76.08
    async.js 2634 113.79
    promiseishKew.js 2654 123.50
    promiseishQ.js 56508 804.21
    andyhu
        10
    andyhu  
       2014-05-19 06:52:54 +08:00   ❤️ 1
    再次更新:
    https://github.com/normalize/mz
    这个模块用bluebird包装了很多node自带的模块,另外可以结合generator使用把异步调用写的和同步一样简洁直观,不用去管node本身的实现直接拿来就用,很不错。基于蓝鸟的速度,性能也不会差哪去,觉得楼主可以试试。用之前可以看看bluebird文档
    WildCat
        11
    WildCat  
    OP
       2014-05-19 07:02:18 +08:00 via iPhone
    @andyhu 谢谢啦,辛苦!
    andyhu
        12
    andyhu  
       2014-05-19 10:30:57 +08:00   ❤️ 1
    @WildCat
    刚写了个测试bluebird并发和顺序执行混合一起的一个脚本,感觉用起来很简单,大赞,看来以后要彻底抛弃async了
    https://gist.github.com/andyhu/c0b3e2c262ad3a17ec3b
    如果电脑里有fiddler,开启fiddler后可以看到这些请求的次序
    WildCat
        13
    WildCat  
    OP
       2014-05-19 11:07:13 +08:00 via iPhone
    @andyhu
    太感谢了!上课比较忙…晚上来拜读下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5466 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:49 · PVG 14:49 · LAX 22:49 · JFK 01:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.