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

时间:2015-04-01 13:08:53

标签: javascript node.js 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/

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

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. 嵌套承诺和回调地狱看起来与我相似。实际上有什么不同吗?
  3. 我是这个承诺概念的新手。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

基本上,Promise的目的是以一种同步性的方式允许功能组合和错误处理。 Promise允许您以线性(可能是错误的术语)或同步的方式读取代码。

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

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

also this link

编辑: 在阅读了您的更新后,您基本上要求的是加入承诺(我认为)

SO Post提供了一些很好的信息。一些更好的库具有实用功能来帮助解决这个问题。

例如,如果使用蓝鸟,请查看join function

答案 1 :(得分:2)

  

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

可能不是。

  

嵌套承诺和回调地狱看起来与我相似。实际上有什么不同吗?

承诺不会自动阻止回调地狱。但是因为它们比简单的"更加灵活。回调,它们可以用不同的方式组成,这样可以更容易地避免回调地狱。


  

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

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

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