我最近开始使用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
})
})
})
从上面的代码片段我有以下问题(/疑惑):
我是这个承诺概念的新手。任何帮助表示赞赏。
答案 0 :(得分:2)
基本上,Promise的目的是以一种同步性的方式允许功能组合和错误处理。 Promise允许您以线性(可能是错误的术语)或同步的方式读取代码。
这是一个广泛的问题,但请查看这些建议的链接。
https://promise-nuggets.github.io/
https://blog.domenic.me/youre-missing-the-point-of-promises/
编辑: 在阅读了您的更新后,您基本上要求的是加入承诺(我认为)
这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]
});