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

你们写 js 各种回调也是这么一层一层吗?

  •  4
     
  •   liushuaikobe · 2014-05-07 16:01:40 +08:00 · 5177 次点击
    这是一个创建于 3888 天前的主题,其中的信息可能已经有所发展或是发生改变。
    新手一个,写node各种异步啊。。于是就有了这样的代码出现:



    这种情况下该怎么写比较好啊,求轻喷
    33 条回复    2014-05-08 14:59:39 +08:00
    rails3
        1
    rails3  
       2014-05-07 16:05:57 +08:00   ❤️ 2
    eventproxy
    liushuaikobe
        2
    liushuaikobe  
    OP
       2014-05-07 16:09:02 +08:00
    @rails3
    竟然是朴灵大大写的。。赞,这就去试试~
    jsonline
        3
    jsonline  
       2014-05-07 16:11:09 +08:00 via Android
    用具名函数替换匿名
    bingdian
        4
    bingdian  
       2014-05-07 16:15:55 +08:00   ❤️ 1
    subpo
        5
    subpo  
       2014-05-07 16:17:06 +08:00
    正常的很,es6有解决方案,这些都是js的原生方式,没必要用什么特别的库
    liushuaikobe
        6
    liushuaikobe  
    OP
       2014-05-07 16:23:31 +08:00
    @subpo
    可能还不大适应这种写法,看些来有点别扭
    akfish
        7
    akfish  
       2014-05-07 16:25:27 +08:00   ❤️ 8
    每次看到这种代码,就会脑补开唱:
    如果你愿意
    一层一层一层的
    剥开我的心
    你会鼻酸
    你会流泪
    jia0
        8
    jia0  
       2014-05-07 16:27:34 +08:00 via Android
    @akfish 赞!
    undozen
        9
    undozen  
       2014-05-07 16:29:28 +08:00
    callbackhell.com

    简单解决:给回调命名
    优雅解决:promise
    liushuaikobe
        10
    liushuaikobe  
    OP
       2014-05-07 16:32:06 +08:00
    @akfish
    眼泪掉下来。。
    akinoniku
        11
    akinoniku  
       2014-05-07 16:32:29 +08:00
    我用async
    liushuaikobe
        12
    liushuaikobe  
    OP
       2014-05-07 16:32:41 +08:00
    @undozen
    赞!
    liushuaikobe
        13
    liushuaikobe  
    OP
       2014-05-07 16:43:09 +08:00
    @undozen
    给函数命名确实能让代码看起来舒服很多,除了命名本身带给人的烦恼(不知道取什么名字好)。。
    chemzqm
        14
    chemzqm  
       2014-05-07 16:43:54 +08:00
    Promise和async的API记不住,我用自己写的 https://github.com/chemzqm/parallel 没几行代码,测试100%覆盖,客户端通用
    paloalto
        15
    paloalto  
       2014-05-07 16:59:55 +08:00
    之前用过这个: https://github.com/chemdemo/node-stepify

    写起来像这样的:

    tyzc
        16
    tyzc  
       2014-05-07 17:05:53 +08:00
    支持promise,这是个非常优雅的解决方法。
    Actrace
        17
    Actrace  
       2014-05-07 17:14:12 +08:00
    既然习惯函数式编程,就不要用回调特性嘛。。。
    bolasblack
        18
    bolasblack  
       2014-05-07 17:17:48 +08:00
    promise 已经被选为 ES6 里的解决方案
    async 的 waterfall 也非常好用

    两个都可以试用一下,然后挑一个自己最喜欢的
    andyhu
        19
    andyhu  
       2014-05-07 17:25:07 +08:00
    async性能好一点,promise更优雅点,不过将来es6的generator是大势所趋,可以用下tj写的的co
    没有装0.11版本的同学也可以考虑用facebook的regenerator模仿下es6的generator特性
    fundon
        20
    fundon  
       2014-05-07 17:41:21 +08:00
    Next generator 是趋势
    ChiChou
        21
    ChiChou  
       2014-05-07 18:07:31 +08:00
    @akfish 把我的台词抢了……
    j
        22
    j  
       2014-05-07 18:12:56 +08:00
    coffee please...
    Ever
        23
    Ever  
       2014-05-07 18:23:36 +08:00
    clowwindy
        24
    clowwindy  
       2014-05-07 18:37:12 +08:00
    tangzx
        25
    tangzx  
       2014-05-07 19:13:43 +08:00 via iPhone
    @akfish 哈哈哈哈,如果爱,请深爱
    mcfog
        26
    mcfog  
       2014-05-07 19:52:36 +08:00
    必须用Promise

    generator在展现出同等的异常处理能力之前,只能作为promise的附属存在

    展现出同等的异常处理之后,还要解决API描述困难的问题才能赶上promise
    belin520
        27
    belin520  
       2014-05-08 00:01:21 +08:00
    @rails3
    世界上本没有callback,写的人多了,就有了 }}}}}}}} -- BelinChung
    jinbakei
        28
    jinbakei  
       2014-05-08 09:28:04 +08:00
    promise
    celon
        29
    celon  
       2014-05-08 10:07:29 +08:00
    async.waterfall也是不错的选择
    crossmaya
        30
    crossmaya  
       2014-05-08 10:36:55 +08:00
    q.js
    zythum
        31
    zythum  
       2014-05-08 10:44:37 +08:00
    其实 朱一觉得啊...写callback挺好的...
    countcain
        32
    countcain  
       2014-05-08 10:52:23 +08:00
    可以看看 defer promise 机制
    arron
        33
    arron  
       2014-05-08 14:59:39 +08:00
    @clowwindy 我看那个测试第一个就说明不了什么问题,他那个闭包比new object每次执行都多创建了一个函数,实际上他只是测试了创建100万个函数要多出多少内存。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1384 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 17:40 · PVG 01:40 · LAX 09:40 · JFK 12:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.