【问题标题】:Should I use ''return" with my callback function in Javascript?我应该在 Javascript 中将“return”与我的回调函数一起使用吗?
【发布时间】:2020-05-06 21:26:26
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 那要看情况了,你想把undefined以外的东西返回给getData吗?
  • 哦,这就是它所依赖的?
  • @adeneo 不,那是异步功能。他没有回到那个价值。你使用哪一个并不重要。可以使用return提前退出函数,否则没关系。
  • @MikeC - TL;DR,它看起来是如此同步,也许 OP 应该在那里抛出一个超时以使其更清晰
  • @adeneo 是的,我猜理论上他们除了运行回调之外还可以从中返回一些东西(假设回调在实际异步的东西内部,例如setTimeout),所以它可以双向工作。

标签: javascript angularjs asynchronous callback


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    这是真的

    return callback()
    

    实际上等同于

    callback(result); return;
    

    后者确实会在调用堆栈上产生额外的帧,因此会使用更多资源。我想如果你有很多嵌套的回调,或者正在进行递归,你会更快地耗尽堆栈空间。

    这可能是个坏主意,我不认为我在说回调之前的 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',你可能会遇到麻烦。例如,如果您不习惯提前返回,错误处理可能会出现问题。举个例子:

      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 语句来完成同样的事情。

      【讨论】:

      • 这是公牛。我从不期望回调函数返回一个值。在计算完成时,回调在传递值方面替换了返回。在您的示例中,第二个返回已过时,第一个返回只是将函数的其余部分转换为 else 块的不同方式。当你写if(err){ callback(err, null); return; }而不是暗示回调方法可能会返回结果时,它更有可能理解发生了什么。
      • 这变成了一个偏好问题。我希望能够一次调试一个函数,方法是确保它返回对我预期的调用。
      • by ensuring that it returned a call 是什么意思?你可以调用一个函数,你可以返回一个值。
      • 是的,这是一个偏好问题,但是每个人都应该知道,这只是一个懒惰的捷径等等。我会考虑一种不好的做法,例如在条件内分配值。这可能会导致混乱。
      • 这很公平。我习惯于这样写它,因为它在语义上对我有意义。如果没有这样的返回值,一个人无法“纯粹”单独测试一个函数,否则您将不得不监视第二个函数以确保它是从主函数调用的。如果你的函数所做的只是返回对另一个函数的调用,为什么不写出来呢?
      猜你喜欢
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      相关资源
      最近更新 更多