我知道我们不应该返回node.js异步函数中的对象,并且异步函数内的每个路径都应该导致回调函数。要解决厄运的金字塔问题。在某种程度上问题和更好的可读性,只需说"返回;"在调用回调函数之后,我不必将其余的代码放在else块中并跳过缩进并获得更好的可读性。到目前为止,该代码一直运行正常,但只是想知道是否有任何我可以忽略的潜在问题。
(function(database) {
var mongodb = require("mongodb");
database.ObjectID = mongodb.ObjectID;
var mongoUrl = "mongodb://localhost:27017/mydb";
var dbconn = null;
database.getDBConn = function(next){
if(dbconn){ next(null, dbconn); return; } //already connected: return dbconn
mongodb.MongoClient.connect(mongoUrl,function(err, database){
if(err){ next(err, null); return; } //connection fail: return error
dbconn = {db: database,
movies: database.collection("movie") };
next(null, dbconn); //connection success: return dbconn
});
}
})(module.exports);
答案 0 :(得分:1)
你看起来很好看。您只需要确保每个回调中的每个if / else代码路径都有一个" next"。
在某些时候,您可能希望通过使用async module(更易于访问)或promises module(更多,更少)来避免使用厄运金字塔。
答案 1 :(得分:1)
不,没有问题,但你可以争论可读性。
if(foo) {
// do something
} else {
// do something else
}
比
的可读性差得多if(foo) {
// do something
return;
}
// do something else
虽然我个人认为第一个版本是逻辑序列的更好表示,也是在第一个和第二个替代之后运行代码的唯一方法,但这不适用于您的情况。
可以像你一样缩短流量。使用JavaScript时,我会更短:
if(err) return next(err, null);
如果设置了err
参数,大多数回调应该忽略数据参数,以下内容应该足够了:
if(err) return next(err);
这是最短的形式,我更喜欢每个if-else语句。