你们写 js 各种回调也是这么一层一层吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liushuaikobe
V2EX    Node.js

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

  •  4
     
  •   liushuaikobe 2014-05-07 16:01:40 +08:00 5726 次点击
    这是一个创建于 4232 天前的主题,其中的信息可能已经有所发展或是发生改变。
    新手一个,写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
    icanfork
        27
    icanfork  
       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     Solana     5810 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 02:42 PVG 10:42 LAX 18:42 JFK 21:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86