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

2018-09-26 14:07:34 +08:00
 nyse

大概就像下面情况:

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

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

})

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

6620 次点击
所在节点    JavaScript
23 条回复
dilu
2018-09-26 14:12:45 +08:00
业务本身就是逻辑套逻辑 不管怎么样总归都会有这种情况出现

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

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/492759

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX