node.js异步函数的可读性

时间:2014-04-27 14:41:24

标签: node.js asynchronous callback readability

我知道我们不应该返回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);

2 个答案:

答案 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语句。