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 }) }) })
从上面的代码片段我有以下问题(/怀疑):
- 除了使代码更易读,承诺是否具有性能优势?
- 嵌套承诺和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