【问题标题】:Node JS - Should i do "return cb(..)" or first cb(..) and then return?Node JS - 我应该“返回 cb(..)”还是先返回 cb(..) 然后返回?
【发布时间】:2018-01-26 04:17:45
【问题描述】:

这可能是一个愚蠢的问题,但我只想知道这样做的含义:

每当我遇到错误或想要完成某些功能流程时,我都会收到如下指令:

if(err) {
    cb(err);   // or for example res.json({...});
    return;
}

但是我看到了一些格式如下的代码:

if(err) {
    return cb(err);
}

这样做是否有任何记忆或其他风险?对所有函数进行函数取值?

推荐的方法是什么?

【问题讨论】:

    标签: javascript node.js express memory-management callback


    【解决方案1】:

    如果宿主函数和调用者不期望返回值,那么您的两个选择中的任何一个都将执行相同的操作。第二个:

    return cb(err);
    

    通常纯粹出于速记的原因(将返回放在一行上)。就我个人而言,我不喜欢这种简写,因为当人们阅读这段代码时,它暗示cb() 正在返回一个你想从宿主函数返回的值,但根本不是这样。

    所以,我更喜欢:

    if(err) {
        cb(err);   // or for example res.json({...});
        return;
    }
    

    甚至有时:

    if(err) {
        cb(err);   // or for example res.json({...});
    } else {
        // other code here
    }
    

    因为这两者都更清楚地表明主机函数或回调没有预期的返回值。但是,这是我对代码清晰度的看法 - 执行没有实质性差异。

    这样做是否有任何记忆或其他风险?对所有函数进行函数取值?

    一个普通的return 语句或一个没有任何return 语句就结束的函数返回undefined。如果cb() 从主机函数返回undefined, thenreturn cb()also returnsundefined`。因此,那里的返回值也应该没有区别。返回值没有差异,内存使用应该没有差异。

    return cb() 代码确实允许回调返回一个值,该值也成为主机函数的返回值。如果这是您想要的,那么您将不得不以这种方式对其进行编码,但这通常不是您想要的,因此使用 return cb() 允许调用者以您不想要的方式使用回调返回值您可能会在将来无意中中断,因为它不是预期的功能。

    【讨论】:

    • return cb(...) 使其成为尾调用,理论上它可以比cb(...); return 使用更少的堆栈空间,但我不确定 V8 是否真的在任何情况下都应用了这种优化。
    • @icktoofay - 也不清楚即使它被视为尾随电话,它是否会在这里产生任何影响。尾调用递归是一个有趣的优化,这个(不是递归),没那么多。
    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2019-10-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多