我在我的JS应用程序中使用异步函数,这些函数包装有接收回调输入的我自己的函数。当我调用回调函数时,是否需要使用“ return”关键字?有关系吗?有什么区别?
例如:
var getData = function(callback){
// do some aysnc db stuff...
return callback(results);
// or just
callback(results);
}
PS:我正在使用JavaScript编写混合移动应用程序。
如果您只有一个遍历函数的路径,那么您可以互换使用这两种形式。当然,该函数的返回值将在没有返回值的情况下是不确定的,但是您的调用代码可能仍未使用它。
的确是
return callback()
实际上相当于
callback(result); return;
后者的确会在调用堆栈上导致额外的帧,因此会占用更多资源。我想如果您有许多嵌套的回调,或者正在执行递归,那么您将更快地耗尽堆栈空间。
这可能是个坏主意,我不认为我在说回调之前的返回更加惯用了。
当函数中有多个路径时,请务必小心。例如,这将按预期工作:
(cb)=> {
if (something) cb('a')
else cb('b')
}
但是,在这种情况下,两个回调都将被调用。
(cb)=> {
if (something) cb('a');
cb('b')
}
当您阅读以上内容时,很明显两者都会被调用。然而,编写这样的代码是一个经典的节点新手错误(尤其是在处理错误时)。如果您要执行或要执行,则需要:
(cb)=> {
if (something) return cb('a');
cb('b')
}
否,回叫不应与回叫一起使用。我从不希望回调函数返回值。在(异步)计算完成后,回调将通过返回值来替换返回值。
您可以将此语法return callback(result)
用作callback(result); return;
之类的快捷方式,但它可能会使其他团队成员感到困惑,回调可能返回哪种值。实际上,这是您的缩小程序创建此类代码的任务;不是你的。
您不必这样做,但如果不使用'return',则可能会遇到麻烦。例如,如果您不习惯于提早退货,那么错误处理就会成为问题。例如:
var getData = function(callback){
dbStuff(function(err, results) {
if (err) { callback(err, null); }
callback(null, results);
});
}
我一般认为完成后返回是一种很好的做法...
var getData = function(callback){
dbStuff(function(err, results) {
if (err) { return callback(err, null); }
return callback(null, results);
});
}
但是您可以使用if / else块并且没有return语句来完成相同的操作。