到目前为止,我从未返回任何异步回调,我刚刚调用它们。我不知道(愚蠢的我!)回调调用之后的代码也被执行了。
这显示了我的意思:
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:
我希望这不是基于意见的。
答案 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和可选参数。doSomething
,doSomethingSync
,doSomethingAsync
<确定/ LI>
因此,如果从异步函数返回某些内容,则应对模块中的所有异步函数执行相同操作。理想情况下使用现有约定,如返回EventEmitter或Promise。
如果不期望这种行为,通常会被视为不良行为。