JS: 在 then 里面又调用了一个返回 Promise 的函数,是不是不太优雅? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
nyse
V2EX    Javascript

JS: 在 then 里面又调用了一个返回 Promise 的函数,是不是不太优雅?

  •  
  •   nyse 2018-09-26 14:07:34 +08:00 6965 次点击
    这是一个创建于 2572 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大概就像下面情况:

    someFunc() .then(() => { somePromiseFunc() .then(() => { }) .catch(() => { }) }) .catch(() => { }) 

    Promise 本来就是用来解决嵌套回调不清晰的问题,但是现在又遇到这种问题,如果 Promise 成功后,又调用一个返回 Promise 的函数,还是会出现这种嵌套的问题。

    第 1 条附言    2018-09-26 14:56:10 +08:00
    好的,听了大家的意见,用 async/await 改写了。

    还想问问各位大佬,ES 变化这么快,你们是怎么保持跟进学习的?
    23 条回复    2018-10-10 21:21:41 +08:00
    dilu
        1
    dilu  
       2018-09-26 14:12:45 +08:00
    业务本身就是逻辑套逻辑 不管怎么样总归都会有这种情况出现

    promise 不是把回调干掉了,而是换了一种写法,更加的简介而已

    回调噩梦一直会存在,还好我是做后端的,哈哈哈,逃。
    p1llar
        2
    p1llar  
       2018-09-26 14:15:03 +08:00   2
    可以写成:

    ```Javascript
    someFunc()
    .then(() => {
    return somePromiseFunc()
    })
    .then(() => {

    })
    .catch(() => {
    })
    ```

    或者直接用 async/await 吧,Promise 还是太丑了
    cuzfinal
        3
    cuzfinal  
       2018-09-26 14:15:10 +08:00
    用 async/await
    CDL
        4
    CDL  
       2018-09-26 14:16:23 +08:00
    还好楼上是做后端的,手动狗头
    多看文档和教程,return promise 是可以继续 then 链式调用的
    Jeepeng
        5
    Jeepeng      2018-09-26 14:16:56 +08:00   1
    可以用 async/await 改写
    ```js
    try {
    const result = await someFunc();
    await somePromiseFunc();
    } catch(err) {}
    ```
    icris
        6
    icris  
       2018-09-26 14:17:00 +08:00
    someFunc()
    .then(somePromiseFunc)
    .catch(e => {

    })
    icanfork
        7
    icanfork  
       2018-09-26 14:19:36 +08:00
    链式调用
    shakaraka
        8
    shakaraka  
    PRO
       2018-09-26 14:26:18 +08:00
    在 then 里 return 一个 promise,可以直接继续 then,或则 async/await
    whypool
        9
    whypool  
       2018-09-26 14:31:32 +08:00
    async/await 写起来才好看
    AV1
        10
    AV1  
       2018-09-26 14:35:23 +08:00 via Android
    除了封装接口的需要,不然都全用 async 函数。
    q397064399
        11
    q397064399  
       2018-09-26 14:41:52 +08:00
    async/await 只能这样了
    lhx2008
        12
    lhx2008  
       2018-09-26 15:02:39 +08:00 via Android
    @dilu 后端也可以写回调,只要是异步框架
    Exin
        13
    Exin  
       2018-09-26 15:42:29 +08:00
    如果异步操作需要并行的话,可以取楼主本来的写法,但这种做法比较极端、不常见。
    kuaner
        14
    kuaner  
       2018-09-26 16:04:21 +08:00
    链式调用,直接 return 内部那个 promise 就好了吧

    不要写成地狱的形式....
    liuhuansir
        15
    liuhuansir  
       2018-09-26 16:17:35 +08:00
    链式调用比 async/await 优雅吧,很有条理性,类似的 rx 系列有各个语言的实现版
    shijianit
        16
    shijianit  
       2018-09-26 16:23:31 +08:00
    promise 本身就是为了避免层层嵌套
    per
        17
    per  
       2018-09-26 19:22:17 +08:00 via iPhone
    Promise.all?
    dilu
        18
    dilu  
       2018-09-26 19:49:23 +08:00 via Android
    @lhx2008 不好意思我是拍黄片的哈哈哈,我们基本没啥机会写异步,哈哈哈(ω)hiahiahia
    wsxyeah
        19
    wsxyeah  
       2018-09-26 20:58:10 +08:00
    Promise 能够写成一条链是理想化的情况了。实际用的时候会发现嵌套难以避免。
    很多地方的数据流并不是理想化的管道传递,而是需要透传数据给后面的情况,这时候就不得不嵌套;另外一种情况是需要 catch 局部错误而不想影响整条链的错误传递。
    wizardforcel
        20
    wizardforcel  
       2018-09-26 21:26:05 +08:00 via Android
    只有我一个人想到 return somePromiseFunc()嘛。。
    FakeLeung
        21
    FakeLeung  
       2018-09-26 21:40:58 +08:00
    someFunc().then(somePromiseFunc).catch()

    or

    try{
    const res1 = await someFunc()
    const res2 = await somePromiseFunc(res1)
    } catch(e) {}
    whosesmile
        22
    whosesmile  
       2018-09-27 11:17:33 +08:00
    除非写 node, 纯前端代码,我习惯还是写 promise;
    asyc 的问题是异常处需要 try catch,这让我很蛋疼
    civet
        23
    civet  
       2018-10-10 21:21:41 +08:00 via iPhone
    不是二楼已经终结了问题吗?同意楼上,前端用 promise 就够了。如果还需要三四次或更多的异步操作,难道不是服务 API 设计有问题?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5926 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 06:30 PVG 14:30 LAX 23:30 JFK 02:30
    Do have faith in what you're doing.
    ubao 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