我应该在JavaScript的回调函数中使用“ return”吗?

问题描述 投票:3回答:3

我在我的JS应用程序中使用异步函数,这些函数包装有接收回调输入的我自己的函数。当我调用回调函数时,是否需要使用“ return”关键字?有关系吗?有什么区别?

例如:

var getData = function(callback){
    // do some aysnc db stuff...
    return callback(results);
    // or just
    callback(results);
}

PS:我正在使用JavaScript编写混合移动应用程序。

javascript angularjs asynchronous callback
3个回答
1
投票

如果您只有一个遍历函数的路径,那么您可以互换使用这两种形式。当然,该函数的返回值将在没有返回值的情况下是不确定的,但是您的调用代码可能仍未使用它。

的确是

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')
}

3
投票

否,回叫不应与回叫一起使用。我从不希望回调函数返回值。在(异步)计算完成后,回调将通过返回值来替换返回值。

您可以将此语法return callback(result)用作callback(result); return;之类的快捷方式,但它可能会使其他团队成员感到困惑,回调可能返回哪种值。实际上,这是您的缩小程序创建此类代码的任务;不是你的。


0
投票

您不必这样做,但如果不使用'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语句来完成相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.