【发布时间】:2015-04-12 21:09:40
【问题描述】:
到目前为止,我从未返回任何异步回调,我只是调用了它们。我不知道(愚蠢的我!)回调调用之后的代码也会被执行。
这说明了我的意思:
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:
- 更少的代码和更少的嵌套(-> 更好的可读性?)
- 可以更好地扩展
我希望这不是太基于意见。
【问题讨论】:
-
我不完全同意
less code and less nesting -> better readability,例如我发现版本1 更易读。我发现有时单行if-else 很难快速阅读。对不起小OT -
这是基于主要意见的。除了
return的含义不同之外,就我个人而言,版本 1 可读性更好,我更喜欢它,因为如果那个地方有问题,我可以在callback(err);之前插入一些调试/日志信息。但这与你的问题的第一部分有什么关系,你在哪里返回一个回调来阻止下面的代码被执行? -
好的。我同意你的看法。括号提高了可读性,因此版本 1 对此更好。 @t.niese 在版本 1 中不返回回调。我的主要意图是询问这是否是一种不好的做法,应该始终避免。
-
从异步函数返回一些东西(除了链接)是不常见的,可以被认为是不好的做法。 js 中从异步调用返回的唯一常见模式是支持:
asyncCall(callback)和asyncCall().on('error',errorCallback).on('end',endCallback').on('result',resultCallback)或 Promise/A+obj.doAsync().then(resultCallback) -
我不是在谈论返回什么,而是像我在版本 2 中那样“返回”回调调用。这有什么问题?
标签: javascript node.js asynchronous