干净的代码和嵌套的承诺 [重复]

Posted

技术标签:

【中文标题】干净的代码和嵌套的承诺 [重复]【英文标题】:Clean code and Nested promises [duplicate] 【发布时间】:2016-08-23 08:27:48 【问题描述】:

使用嵌套 promise 编写干净代码的正确策略是什么?使用 Promise 背后的想法之一是摆脱嵌套回调,也就是 callback hell。即使在使用 Promise 时,有时嵌套似乎也是不可避免的:

User.find(hande: 'maxpane')
  .then((user) => 
    Video.find(handle: user.handle)
     .then((videos) => 
       Comment.find(videoId: videos[0].id)
        .then((commentThead) => 
            //do some processing with commentThread, vidoes and user
        )
     )
  ) 

有没有办法摆脱嵌套并使代码更“线性”。事实上,这段代码看起来与使用回调的代码没有太大区别。

【问题讨论】:

似乎this answer 对你来说可能是一本不错的读物,如果不是重复的话。 【参考方案1】:

使用 Promise 的最大优势是链式。这就是你应该正确使用它的方式:

User.find(handle: 'maxpane')
.then((user) => 
  return Video.find(handle: user.handle)
)
.then((videos) => 
  return Comment.find(videoId: videos[0].id)
)
.then((commentThead) => 
  //do some processing with commentThread, vidoes and user
)

每次您在 .then 中返回一个 Promise 时,它​​都会用作下一个 .then 回调的 Promise。

【讨论】:

commentThreadvideosuser变量在最终函数中可用,在我看来只有commentThread在函数范围内。

以上是关于干净的代码和嵌套的承诺 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何避免我的 Firebase Cloud Function 中的嵌套承诺 [重复]

如何将我的代码从回调函数更改为承诺 [重复]

使用 Q 承诺 - 有没有办法减少这段代码的重复性?

暂停功能,直到承诺解决[重复]

重复执行时未处理的承诺拒绝

处理多个承诺拒绝[重复]