我应该在Javascript中使用''return'和我的回调函数吗?

时间:2016-01-10 14:59:16

标签: javascript angularjs asynchronous callback

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

例如:

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

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

3 个答案:

答案 0 :(得分:3)

不,回调不应与返回一起使用。
我永远不会期望回调函数返回一个值。 当(异步)计算完成时,回调在传递值方面替换了返回。

您可以使用此语法return callback(result)作为类似callback(result); return;的快捷方式,但它可能会混淆其他一些团队成员,可能返回什么样的值回调。
这实际上是你的minifyer的任务,创建这样的代码;不是你的。

答案 1 :(得分:0)

如果您只有一条通过功能的路径,那么您可以互换使用这两种形式。当然,函数的返回值在没有返回的情况下是未定义的,但是你的调用代码可能还没有使用它。

这是真的

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

答案 2 :(得分: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语句来完成同样的事情。