节点JS - 我应该“返回cb(..)”或第一个cb(..)然后返回?

时间:2018-01-26 04:17:45

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

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

每当我收到错误或者我想完成一些函数流程时,我都会有如下指令:

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

但是我看到了一些具有以下格式的代码:

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

这样做会有任何记忆或其他风险吗?在所有函数上继承函数值?

推荐的方法是什么?

1 个答案:

答案 0 :(得分:2)

如果主机函数和调用者不期望返回值,则两个选项中的任何一个将以相同的方式执行。第二个:

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, then从主机函数返回cb()also returns undefined`。所以,那里的回报值应该没有差别。如果返回值没有差异,则内存使用量应该没有差异。

return cb()代码允许回调返回一个值,该值也成为主机函数的返回值。如果那是你想要的,那么你必须以这种方式编码,但这通常不是你想要的,所以使用return cb()允许调用者可能使用回调返回值一种你不打算在将来无意中破坏的方式,因为它不是一个预期的功能。