大概就像下面情况:
someFunc() .then(() => { somePromiseFunc() .then(() => { }) .catch(() => { }) }) .catch(() => { })
Promise 本来就是用来解决嵌套回调不清晰的问题,但是现在又遇到这种问题,如果 Promise 成功后,又调用一个返回 Promise 的函数,还是会出现这种嵌套的问题。
1 dilu 2018-09-26 14:12:45 +08:00 业务本身就是逻辑套逻辑 不管怎么样总归都会有这种情况出现 promise 不是把回调干掉了,而是换了一种写法,更加的简介而已 回调噩梦一直会存在,还好我是做后端的,哈哈哈,逃。 |
2 p1llar 2018-09-26 14:15:03 +08:00 ![]() 可以写成: ```Javascript someFunc() .then(() => { return somePromiseFunc() }) .then(() => { }) .catch(() => { }) ``` 或者直接用 async/await 吧,Promise 还是太丑了 |
![]() | 3 cuzfinal 2018-09-26 14:15:10 +08:00 用 async/await |
4 CDL 2018-09-26 14:16:23 +08:00 还好楼上是做后端的,手动狗头 多看文档和教程,return promise 是可以继续 then 链式调用的 |
5 Jeepeng ![]() 可以用 async/await 改写 ```js try { const result = await someFunc(); await somePromiseFunc(); } catch(err) {} ``` |
6 icris 2018-09-26 14:17:00 +08:00 someFunc() .then(somePromiseFunc) .catch(e => { }) |
![]() | 7 icanfork 2018-09-26 14:19:36 +08:00 链式调用 |
![]() | 8 shakaraka PRO 在 then 里 return 一个 promise,可以直接继续 then,或则 async/await |
![]() | 9 whypool 2018-09-26 14:31:32 +08:00 async/await 写起来才好看 |
![]() | 10 AV1 2018-09-26 14:35:23 +08:00 via Android 除了封装接口的需要,不然都全用 async 函数。 |
![]() | 11 q397064399 2018-09-26 14:41:52 +08:00 async/await 只能这样了 |
![]() | 13 Exin 2018-09-26 15:42:29 +08:00 如果异步操作需要并行的话,可以取楼主本来的写法,但这种做法比较极端、不常见。 |
14 kuaner 2018-09-26 16:04:21 +08:00 链式调用,直接 return 内部那个 promise 就好了吧 不要写成地狱的形式.... |
![]() | 15 liuhuansir 2018-09-26 16:17:35 +08:00 链式调用比 async/await 优雅吧,很有条理性,类似的 rx 系列有各个语言的实现版 |
![]() | 16 shijianit 2018-09-26 16:23:31 +08:00 promise 本身就是为了避免层层嵌套 |
![]() | 17 per 2018-09-26 19:22:17 +08:00 via iPhone Promise.all? |
![]() | 19 wsxyeah 2018-09-26 20:58:10 +08:00 Promise 能够写成一条链是理想化的情况了。实际用的时候会发现嵌套难以避免。 很多地方的数据流并不是理想化的管道传递,而是需要透传数据给后面的情况,这时候就不得不嵌套;另外一种情况是需要 catch 局部错误而不想影响整条链的错误传递。 |
![]() | 20 wizardforcel 2018-09-26 21:26:05 +08:00 via Android 只有我一个人想到 return somePromiseFunc()嘛。。 |
![]() | 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) {} |
![]() | 22 whosesmile 2018-09-27 11:17:33 +08:00 除非写 node, 纯前端代码,我习惯还是写 promise; asyc 的问题是异常处需要 try catch,这让我很蛋疼 |
23 civet 2018-10-10 21:21:41 +08:00 via iPhone 不是二楼已经终结了问题吗?同意楼上,前端用 promise 就够了。如果还需要三四次或更多的异步操作,难道不是服务 API 设计有问题? |