返回异步回调作为最佳做法?

时间:2015-02-12 08:05:29

标签: javascript node.js asynchronous

到目前为止,我从未返回任何异步回调,我刚刚调用它们。我不知道(愚蠢的我!)回调调用之后的代码也被执行了。

这显示了我的意思:

var asyncFunctionNoReturn = function(callback) {
    alert('Inside asyncFunctionNoReturn');
    callback();
    alert('Still inside asyncFunctionNoReturn');
};

var asyncFunctionReturn = function(callback) {
    alert('Inside asyncFunctionReturn');
    return callback();
    alert('You will never see me! :(');
};

asyncFunctionNoReturn(function() {
    alert('I am called back!');
});

asyncFunctionReturn(function() {
    alert('I am called back!');
});

对我而言,只有在回调电话后有代码时才会这样:

版本1:

...
if(err) {
    callback(err);
} else {
    callback(null, data);
}

第2版:

...
if(err) return callback(err);
return callback(null, data);

我见过两个版本。哪一个被确立为“最佳实践”?

我的猜测是版本2:

  • 更少的代码和更少的嵌套( - >更好的可读性?)
  • 可以更好地扩展

我希望这不是基于意见的。

2 个答案:

答案 0 :(得分:2)

首先,我并不总是同意道格拉斯·克罗克福德(OMG,我说了什么?;-)),但我认为他对if陈述是正确的:它应该总是用括号写的(http://javascript.crockford.com/code.html)。

我不同意你的看法:更少的代码并不意味着更好的可读性,对我来说,第一个版本对于代码的意图更为明显。让我们现在拥有的(神奇)工具担心缩小/丑化生产代码。

不过,你仍然可以(应该?)返回回调的结果。

所以我会写:

if (err) {
    return callback(err);
} else {
    return callback(null, data);
}

答案 1 :(得分:0)

根据环境和框架,您有不同的惯例。

使用 node.js 中的js以及浏览器中关于异步的常见约定是:

  • 常规异步函数将可选回调作为最后一个参数
  • 回调必须看起来像callback( err, args1, ...) err并且在错误的情况下没有参数,并且成功时err null和可选参数。
  • 回调必须是始终 async。
  • 库/模块的异步功能所有的行为应相同,或者其行为应由命名doSomethingdoSomethingSyncdoSomethingAsync <确定/ LI>

因此,如果从异步函数返回某些内容,则应对模块中的所有异步函数执行相同操作。理想情况下使用现有约定,如返回EventEmitter或Promise。

如果不期望这种行为,通常会被视为不良行为。