callback地狱和嵌套承诺之间的区别

我最近开始使用NodeJS和MongoDB(使用Monk)。 这是当我遇到“回拨地狱”这个词。 在我的代码中,我正在做同样的事情。 举个例子 –

DBCall(d1, function(e, docs){ if(docs.length!=0) DBCall(d2, function(e, docs1){ if(docs1.length!=0) DBCall(d3, function(e, docs2){ //doing something with docs,docs1,docs2 }) }) }) 

这是当我开始阅读“承诺”,我碰到这篇文章 – https://strongloop.com/strongblog/promises-in-node-js-with-q-an-alternative-to-callbacks/

由于我在第三个callback中需要docs和docs1,所以我使用了嵌套的promise。

 DBCall(d1) .then(function(docs){ if(docs.length!=0) return DBCall(d2) .then(function(docs1){ if(docs1.length!=0) return DBCall(d3) .then(function(docs2){ //doing something with docs,docs1,docs2 }) }) }) 

从上面的代码片段我有以下问题(/怀疑):

  1. 除了使代码更易读,承诺是否具有性能优势?
  2. 嵌套承诺和callback地狱看起来类似于我。 实际上有什么区别?

我对这个承诺的概念很陌生。 任何帮助表示赞赏。

除了使代码更易读,承诺是否具有性能优势?

可能不会。

嵌套承诺和callback地狱看起来类似于我。 实际上有什么区别?

承诺不会自动阻止回拨地狱。 但是由于它们比“简单”的callback更灵活,所以它们可以以不同的方式组成,这使得回避地狱更容易。


由于我在第三个callback中需要docs和docs1,所以我使用了嵌套的promise。

有时嵌套的承诺是不可避免的。 但是,如果不需要按顺序执行,则不需要嵌套它们。 你可以并行执行它们:

 Promise.all([ DBCall(d1), DBCall(d2), DBCall(d3) ]).then(function(docs) { // docs is an array: [docs, docs1, docs2] }); 

基本上,Promise的目的是以一种同步性的方式允许function组合和error handling。 承诺允许你阅读代码线性(也许是错误的)或同步fasion。

这是一个广泛的问题,但请看看这些build议的链接。

https://promise-nuggets.github.io/
https://blog.domenic.me/youre-missing-the-point-of-promises/

也是这个环节

编辑:在阅读你的更新后,你实质上要求的是join承诺(我认为)

这SO贴子给了一些很好的信息。 一些更好的图书馆有实用function来帮助这一点。

例如,如果使用蓝鸟来看看连接function