【问题标题】:readability of node.js asynchronous functionsnode.js 异步函数的可读性
【发布时间】:2014-06-13 00:50:12
【问题描述】:

我知道我们不应该在 node.js 异步函数中返回对象,并且异步函数中的每条路径都应该指向回调函数。为了在一定程度上解决“末日金字塔”的问题,为了更好的可读性,直接说“return”可以吗?在调用回调函数之后,我不必将其余代码放在 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);

【问题讨论】:

    标签: node.js asynchronous callback readability


    【解决方案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 语句。

    【讨论】:

    • 那么像下面这样返回回调函数没有任何副作用可以吗? //返回回调(err, null);
    • @nomongo。在您的情况下,它的功能非常好。但是如果你仔细想想,你需要保持 3 个不同的上下文——回调中的返回值、调用回调的函数以及返回值在最终返回之后的去向。这有时会产生神秘的难以追踪的错误,我个人不喜欢这么努力地思考。老实说,我更喜欢带有“{...}”的原始版本,部分原因是它将通过 JSLint/JSHint。再说一遍——我不喜欢这么努力地思考。
    • 感谢@mjhm 和@still_learning。急切地等待节点 v0.12,以便我可以使用生成器..
    • @nomongo @mjhm 没有异步函数应该返回一个值。假设next 不返回值,return next(err); 实际上返回undefined,因此等价于next(err); return;。所以是的,可以使用其中一种简短的形式,无论它们是否会通过 lint。
    【解决方案2】:

    在我看来,你所拥有的一切都很好。您只需要确保每个回调中的每个 if/else 代码路径都有一个“下一个”。

    在某些时候,您可能希望通过使用async module(更易于访问)或promises module(事半功倍)来避免末日金字塔。

    【讨论】:

      猜你喜欢
      • 2016-03-08
      • 2019-01-20
      • 2019-07-04
      • 2016-01-02
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多