【问题标题】:coffeescript return function callback acting strange咖啡脚本返回函数回调行为奇怪
【发布时间】:2013-10-28 13:24:36
【问题描述】:

假设我有一个这样的简单函数:

foo ->  
  User.findById someId, (err, user) ->
    return "hello #{user.name}"  

coffeescript translate 到那个:

foo(function() {
  return User.findById(someId, function(err, user) {
   return "hello " + user.name;
  });
});

所以由于某种原因这里有 2 个返回,但我只想在回调之后返回“hello”。

我发现在使用函数时不返回函数的唯一方法是用return 关闭它(这是一个奇怪的解决方法)。所以:

foo ->  
  User.findById someId, (err, user) ->
    return "hello #{user.name}"
  return 

将翻译成:

foo(function() {
  User.findById(someId, function(err, user) {
    return "hello " + user.name;
  });
});

除了使用return 键关闭函数之外,还有更好的方法吗?

【问题讨论】:

  • 不清楚您要做什么,但 Coffeescript 翻译器只是按照您的指示去做。你的第一个例子说,“函数'foo'应该调用函数'User.findById'并将'someId'和另一个函数的值传递给它,它接受两个参数'err'和'user',并返回一个字符串。 "

标签: javascript coffeescript


【解决方案1】:

没关系,Coffeescript 就是这样工作的,它总是返回函数的最后一个表达式,除非你返回 undefined 和一个空的 return,或者别的什么。

【讨论】:

  • 但这不是函数的最后一行,回调里面还有一行
  • 这不是最后一行,因为它是一个回调。函数的最后一行是User.findById...。 Coffeescript 对 每个 函数执行此操作,回调也是如此。
  • 我应该说“表达”而不是“行”。这没什么大不了的,他们认为您的取消是正确的。
  • 我明白了。所以不是用另一个词来包装它吗?我觉得return 用作更接近功能的方式是错误的。应该改为 end 之类的东西
  • 我同意,我是LiveScript 的粉丝,您可以像!-> 一样避免它。
【解决方案2】:

如果你想从匿名函数返回 "hello #{user.name}" 而从 foo 不返回任何内容,这样做就足够了:

foo = ->  
  User.findById someId, (err, user) ->
    "hello #{user.name}"
  return 

请注意,您很可能无法访问回调(匿名函数)的返回值。回调由findById 函数调用,该函数很可能会丢弃回调的返回值。

另外,原则上,函数返回一个奇怪的值并不重要,只要它从未被使用过。如果你想创建一个非常干净的 API,你只需要在函数体的最后一行显式地添加 returnundefined

【讨论】:

  • 这就是我说奇怪的原因。最后不是return。它更接近函数,应该是end。返回的是内部函数
  • @sagivo: 回调函数中的return 是不需要的,反正都是假设的。
  • 问题不在于那个,问题在于第二个返回(关闭函数的那个​​)
  • CoffeeScript 中没有“结束”。在 CoffeeScript 中,函数的结尾被标记为“dedent”(缩进减少)或可能到达文件末尾。
  • 我明白了,我认为这个答案的重点是证明只要你总是丢弃这个值,如果一个函数返回一些东西是没有问题的。
猜你喜欢
  • 2016-06-20
  • 1970-01-01
  • 2011-11-14
  • 2012-09-03
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
相关资源
最近更新 更多