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 · 6653 次点击
    这是一个创建于 2286 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大概就像下面情况:

    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 => {

    })
    belin520
        7
    belin520  
       2018-09-26 14:19:36 +08:00
    链式调用
    wunonglin
        8
    wunonglin  
       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 写起来才好看
    DOLLOR
        10
    DOLLOR  
       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   ·   实用小工具   ·   2872 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 14:11 · PVG 22:11 · LAX 06:11 · JFK 09:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.