返回异步回调作为最佳实践?
Returning async callback as best practice?
到目前为止,我从未返回过任何异步回调,我只是调用了它们。我不知道(愚蠢的我!)回调调用后的代码也被执行了。
这表明我的意思:
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);
这两个版本我都看过。哪一个被立为"best practice"?
我猜是版本 2:
- 更少的代码和更少的嵌套(-> 更好的可读性?)
- 可以更好地扩展
我希望这不是太基于意见。
首先,我并不总是同意 Douglas Crockford(天哪,我说了什么?;-)),但我认为他对 if
声明的看法是正确的:它应该始终用括号书写(http://javascript.crockford.com/code.html).
我不同意你的看法:更少的代码并不意味着更好的可读性,对我来说,第一个版本更清楚地说明了代码的意图。让我们现在拥有的(惊人的)工具来担心 minifying/uglifying 生产代码。
不过,您仍然可以(应该?)return 回调的结果。
所以我会写:
if (err) {
return callback(err);
} else {
return callback(null, data);
}
根据环境和框架的不同,您有不同的约定。
对于 node.js 中的 js 以及浏览器,关于异步的常见约定是:
- 常规异步函数将可选回调作为最后一个参数
- 回调必须看起来像
callback( err, args1, ...)
有 err
并且在错误的情况下没有参数,并且在成功时 err
null 和可选参数。
- 回调必须调用总是异步。
- library/module 的异步函数应该 所有 行为相同,或者它们的行为应该由它们的命名决定
doSomething
,doSomethingSync
, doSomethingAsync
因此,如果您 return 来自异步函数的内容,您应该对模块中的所有异步函数执行相同的操作。理想情况下使用现有约定,例如 returning EventEmitter 或 Promise。
通常情况下,如果行为不是预期的,则认为是不好的做法。
到目前为止,我从未返回过任何异步回调,我只是调用了它们。我不知道(愚蠢的我!)回调调用后的代码也被执行了。
这表明我的意思:
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);
这两个版本我都看过。哪一个被立为"best practice"?
我猜是版本 2:
- 更少的代码和更少的嵌套(-> 更好的可读性?)
- 可以更好地扩展
我希望这不是太基于意见。
首先,我并不总是同意 Douglas Crockford(天哪,我说了什么?;-)),但我认为他对 if
声明的看法是正确的:它应该始终用括号书写(http://javascript.crockford.com/code.html).
我不同意你的看法:更少的代码并不意味着更好的可读性,对我来说,第一个版本更清楚地说明了代码的意图。让我们现在拥有的(惊人的)工具来担心 minifying/uglifying 生产代码。
不过,您仍然可以(应该?)return 回调的结果。
所以我会写:
if (err) {
return callback(err);
} else {
return callback(null, data);
}
根据环境和框架的不同,您有不同的约定。
对于 node.js 中的 js 以及浏览器,关于异步的常见约定是:
- 常规异步函数将可选回调作为最后一个参数
- 回调必须看起来像
callback( err, args1, ...)
有err
并且在错误的情况下没有参数,并且在成功时err
null 和可选参数。 - 回调必须调用总是异步。
- library/module 的异步函数应该 所有 行为相同,或者它们的行为应该由它们的命名决定
doSomething
,doSomethingSync
,doSomethingAsync
因此,如果您 return 来自异步函数的内容,您应该对模块中的所有异步函数执行相同的操作。理想情况下使用现有约定,例如 returning EventEmitter 或 Promise。
通常情况下,如果行为不是预期的,则认为是不好的做法。